2016-04-08 09:46:40 Boyqicheng 阅读数 7489
  • Flutter开发之Http请求实例

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的用户界面。本课程通过一个获取商品列表的实例带领大家掌握Http网络请求处理方法。

    348 人正在学习 去看看 亢少军
最近在做的项目中,定位后获得的

CLPlacemark类不知道用哪个属性的值来显示地理位置,所有调试的时候用了获取类的所有属性,再获取属性对应的值。一看就明白用哪个属性显示适合

应该特别注意的是在使用 objc_property_t 时先导入头文件 #import<objc/runtime.h>,否则报错:Declaration of 'objc_property_t' must be imported from module 'objectiveC.runtime'before it is required.

/**
 *  获取 类的属性。
 *
 *  @param class 传入的类,其他类的属性方法类似
 *
 *  @return 返回存放属性的数组
 */
- (NSArray *)getClassAttribute:(id)class
{
    unsigned int count;
    objc_property_t *properties = class_copyPropertyList([class class], &count);
    NSMutableArray *propertiesArray = [NSMutableArray arrayWithCapacity:count];
    for(int i = 0; i < count; i++)
    {
        /*
         //  分步取属性
         objc_property_t property = properties[i];
         NSString *name = [NSString stringWithUTF8String:property_getName(property)];
         NSString *attributes = [NSString stringWithUTF8String:property_getAttributes(property)];
         NSLog(@"name0000:%@",name);
         NSLog(@"attributes0000:%@",attributes);
         */
        const char  *propertyName = property_getName(properties[i]);
        [propertiesArray addObject: [NSString stringWithUTF8String:propertyName]];
    }
    free(properties);
    return propertiesArray;
}




调用的时候打印属性值:

 // 如 获取 CLPlacemark 类 使用的时候 这样使用
    CLPlacemark *placeMark = [[CLPlacemark alloc]init];
    NSArray *attributeArr = [self getClassAttribute:placeMark];
    for (int tt = 0; tt < attributeArr.count; tt ++)
    {
        //  打印值 使用 valueForKey:
        NSLog(@"placeMark.%@:%@", attributeArr[tt], [placeMark valueForKey:attributeArr[tt]]);
    }




2016-07-21 17:09:20 Sico2Sico 阅读数 1021
  • Flutter开发之Http请求实例

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的用户界面。本课程通过一个获取商品列表的实例带领大家掌握Http网络请求处理方法。

    348 人正在学习 去看看 亢少军
1、获取父类的所有子类
-(void)getSubclass
{
    int numClasses;
    Class *classes = NULL;
    numClasses = objc_getClassList(NULL,0);

    if (numClasses >0 )
    {
        classes = (__unsafe_unretained Class *)malloc(sizeof(Class) * numClasses);
        numClasses = objc_getClassList(classes, numClasses);
        for (int i = 0; i < numClasses; i++) {
            if (class_getSuperclass(classes[i]) == [BaseTableViewController class]){
                NSLog(@"%@===%@",classes[i], NSStringFromClass(classes[i]));
            }
        }
        free(classes);
    }
}
2、在添加页面统计等时,直接在父类实现添加方法,但是要读到子类的类名
比如在父类中添加友盟页面统计
-(void)viewWillAppear:(BOOL)animated
{
    [super viewWillAppear:animated];
    NSLog(@"%@",[NSString stringWithUTF8String:object_getClassName(self)]);
    [MobClick beginLogPageView:[NSString stringWithUTF8String:object_getClassName(self)]];

}
-(void)viewWillDisappear:(BOOL)animated
{
    [super viewWillDisappear:animated];
    [MobClick endLogPageView:[NSString stringWithUTF8String:object_getClassName(self)]];

}
3、如果要实现添加统计跟踪等,除了在基类实现,还可以通过Method Swizzling来实现
   首先建个UIViewController的扩展类
#import "UIViewController+Log.h"
#import

@implementation UIViewController (Log)
+ (void)load {
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        Class class = [self class];
        // When swizzling a class method, use the following:
        // Class class = object_getClass((id)self);

        SEL originalSelector = @selector(viewDidAppear:);
        SEL swizzledSelector = @selector(xxx_viewDidAppear:);

        Method originalMethod = class_getInstanceMethod(class, originalSelector);
        Method swizzledMethod = class_getInstanceMethod(class, swizzledSelector);

        BOOL didAddMethod =
        class_addMethod(class,
                        originalSelector,
                        method_getImplementation(swizzledMethod),
                        method_getTypeEncoding(swizzledMethod));

        if (didAddMethod) {
            class_replaceMethod(class,
                                swizzledSelector,
                                method_getImplementation(originalMethod),
                                method_getTypeEncoding(originalMethod));
        } else {
            method_exchangeImplementations(originalMethod, swizzledMethod);
        }
    });
}

#pragma mark - Method Swizzling

- (void)xxx_viewDidAppear:(BOOL)animated {
    [self xxx_viewDidAppear:animated];
    NSLog(@"viewWillAppear: %@", self.title);

}

原网址 :http://blog.sina.com.cn/s/blog_881ed8500102vy7g.html

2016-02-20 11:04:29 u011496891 阅读数 3102
  • Flutter开发之Http请求实例

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的用户界面。本课程通过一个获取商品列表的实例带领大家掌握Http网络请求处理方法。

    348 人正在学习 去看看 亢少军
#pragma 获取文件大小
- (CGFloat) getFileSize:(NSString *)path
{
    NSFileManager *fileManager = [[NSFileManager alloc] init];
    float filesize = -1.0;
    if ([fileManager fileExistsAtPath:path]) {
        NSDictionary *fileDic = [fileManager attributesOfItemAtPath:path error:nil];//获取文件的属性
        unsigned long long size = [[fileDic objectForKey:NSFileSize] longLongValue];
        filesize = 1.0*size/1024;
    }
    return filesize;
}

//获取文件的时间
- (CGFloat) getVideoLength:(NSURL *)URL
{
    NSDictionary *opts = [NSDictionary dictionaryWithObject:[NSNumber numberWithBool:NO]
                                                     forKey:AVURLAssetPreferPreciseDurationAndTimingKey];
    AVURLAsset *urlAsset = [AVURLAsset URLAssetWithURL:URL options:opts];
    float second = 0;
    second = urlAsset.duration.value/urlAsset.duration.timescale;
    return second;
}

2016-03-25 21:22:15 lgx_admin 阅读数 1091
  • Flutter开发之Http请求实例

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的用户界面。本课程通过一个获取商品列表的实例带领大家掌握Http网络请求处理方法。

    348 人正在学习 去看看 亢少军

IOS获取当前年月日 时分秒

 NSDate *currentDate = [NSDate date];
    NSCalendar *currentCalendar = [NSCalendar currentCalendar];
    //IOS 8 之后
    NSUInteger integer = NSCalendarUnitYear | NSCalendarUnitMonth |NSCalendarUnitDay | NSCalendarUnitHour | NSCalendarUnitMinute | NSCalendarUnitSecond;
    NSDateComponents *dataCom = [currentCalendar components:integer fromDate:currentDate];
    
    NSInteger year = [dataCom year];
    NSInteger month = [dataCom month];
    NSInteger day = [dataCom day];
    NSInteger hour = [dataCom hour];
    NSInteger minute = [dataCom minute];
    NSInteger second = [dataCom second];
    
    NSLog(@"year===%ld",year);
    NSLog(@"month===%ld",month);
    NSLog(@"day===%ld",day);
    NSLog(@"hour===%ld",hour);
    NSLog(@"minute===%ld",minute);
    NSLog(@"second===%ld",second);



2014-12-15 14:10:36 Friday_Holiday 阅读数 498
  • Flutter开发之Http请求实例

    Flutter是谷歌的移动UI框架,可以快速在iOS和Android上构建高质量的用户界面。本课程通过一个获取商品列表的实例带领大家掌握Http网络请求处理方法。

    348 人正在学习 去看看 亢少军
情景:服务端下发了字段,用来判断客户端是否安装了某一款应用
下发字段为:@“_isInstall_baidu” 
写一个AppInstallInfo的类,里面可以进行判断是否安装了某应用
我期望使用AppInstallInfo._isInstall_baidu的方式进行获取,可以直接得到,但是AppInstallInfo这个类里面 并没有这个属性 这时候,就要用到OC的动态属性
AppInstallInfo *info = [[AppInstallInfo alloc] init];
Bool isInstall = [info  _isInstall_baidu];
或者
Bool isInstall = [info valueForKey:@"_isInstall_baidu”]
或者
Bool isInstall = info._isInstall_baidu
有以上三种方式获取这个值
#import "AppInstallInfo.h"
#import <objc/runtime.h>
@implementation AppInstallInfo
//当我用valueForKey的时候,如果没有这个key 会自动调用这个方法,然后就可以在这个方法里进行一些操作了
- (id)valueForUndefinedKey:(NSString *)key
{
    if ([key rangeOfString:@"_isInstall_"].location == 0)
    {
        NSString* url = @"Baidu_Url";        
        BOOL is =  [[UIApplication sharedApplication] canOpenURL:   [NSURL URLWithString:url]];
        NSNumber* ret = [NSNumber numberWithBool :is];
        return ret;
    }
    
    return [super valueForUndefinedKey:key];
}
//当我掉一个没有声明和实现的方法的时候 比方说[info  _isInstall_baidu](info里并没有声明和实现_isInstall_baidu这个方法)会自动调到这里,然后就可以在这两个方法里做一些操作了
- (NSMethodSignature *)methodSignatureForSelector:(SEL)selector

{
    return [NSMethodSignature signatureWithObjCTypes:"@@:"];
}
- (void)forwardInvocation:(NSInvocation *)invocation

{
    NSString *key = NSStringFromSelector([invocation selector]);
    if ([key rangeOfString:@"_isInstall_"].location == 0)
    {
       
        NSString* url = @"Baidu_Url";        
        BOOL is =  [[UIApplication sharedApplication] canOpenURL:[NSURL URLWithString:url]];

        NSNumber* ret = [NSNumber numberWithBool :is];
        [invocation setReturnValue:&ret];
        return;
    }
    
    else
    {
        return [super forwardInvocation:invocation];

    }
    
}
这样 当我使用
Bool isInstall = [info  _isInstall_baidu];
的时候,就可以从- (void)forwardInvocation:(NSInvocation *)invocation这个方法里得到返回值,得到是否安装的信息了。
当我使用Bool isInstall = [info valueForKey:@"_isInstall_baidu”]
的时候,就可以从- (id)valueForUndefinedKey:(NSString *)key这个方法里得到返回值,得到是否安装的信息了。
目前直接使用Bool isInstall = info._isInstall_baidu是不合法的。Xcode会报错。
但是有一种情况 用谓词NSPredicate的时候 比方说


    NSPredicate* ex = [NSPredicate predicateWithFormat:@"info._isInstall_baidu == 1"];
    NSDictionary* dic = [NSDictionary dictionaryWithObjectsAndKeys:info,@"info", nil];
    BOOL SS = [ex evaluateWithObject:dic];
这么用的时候,把info._isInstall_baidu当成字符串的时候 NSPredicate 会进行转换,换成valueForKey的形式,这样就可以用了。


这样,就实现了获取类的动态属性

如有问题可以发邮件到 friday_holiday@163.com进行讨论

iOS 获取日志

阅读数 2287

iOS获取手机的UUID

阅读数 1187

没有更多推荐了,返回首页