开发技巧篇-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"];