开发技巧篇-4

一、AutoreleasePool

  在ARC环境下,对象的释放是有延迟的,当我们利用for循环创建大量的对象时,可能会由于没有及时释放,对内存造成越来越大的负荷,因此,及时的释放对象显得尤为的重要,此时,可以创建Autoreleasepool定时检测对象是否已出作用域,及时释放对象,例如:

NSMutableArray *array = [NSMutableArray array];
    for (int i = 0; i <= 1000; i ++) {
        @autoreleasepool {
            NSString *str = [[NSString alloc] initWithFormat:@"string_%d",i];
            [array addObject:str];
        }
    }

二、枚举的声明

typedef NS_ENUM(NSInteger,UserSex) {
    Women,
    Men
};

三、@synthesize和@dynamic的作用分别是什么?

  二者都是@property对应的词,如果实现文件里二者都没有写,默认的实现是@synthesize var = _var;

  @synthesize的语义是,如果你没有实现setter和getter方法,系统会帮你默认实现;

  @dynamic的语义是,不让系统默认生成get和set方法的实现,而是由用户自己去实现,如果用户没有实现,调用set和get方法时就会报错;

  附:当同时重写了setter和getter方法时,系统就不会生成成员遍历/实例变量(.m文件),必须写上@synthesize var= _var;

四、@property修饰词的使用

  copy的用途:一般用于不可变的对象,如NSString、NSArray、NSDictionary;

  strong的用途:一般用于可变的对象,如NSMutableArray等;

  copy为何不能用于NSMutable:经过copy后,新对象是不可变的,当使用到可变的对象的一些方法时,就可能导致崩溃;

五、Runloop和线程之间的关系

  Runloop和线程是一一对应的,每个线程包括主线程都有与之对应的Runloop,主线程的Runloop是打开的;

六、Runloop的mode的作用

  • NSDefaultRunLoopMode(kCFRunLoopDefaultMode):默认,空闲状态
  • UITrackingRunLoopMode:ScrollView滑动时
  • UIInitializationRunLoopMode:启动时
  • NSRunLoopCommonModes(kCFRunLoopCommonModes):Mode集

  苹果公开的mode有两个:

    NSDefaultRunLoopMode

    NSRunLoopCommonModes

七、Runloop与NSTimer

  

//将timer添加到NSDefaultRunLoopMode中
[NSTimer scheduledTimerWithTimeInterval:1.0
     target:self
     selector:@selector(timerTick:)
     userInfo:nil
     repeats:YES];
//添加到NSRunLoopCommonModes里
NSTimer *timer = [NSTimer timerWithTimeInterval:1.0
     target:self
     selector:@selector(timerTick:)
     userInfo:nil
     repeats:YES];
[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

 八、手动触发KVO

[p willChangeValueForKey:@"name"];
[p didChangeValueForKey:@"name"];

 

 

 

 

 

 

 

 

 

  

 

posted @ 2016-07-17 18:17  来事啊  阅读(127)  评论(0编辑  收藏  举报