总结
1、理解引用计数
1、工作原理:在引用计数架构下,对象有个计数器,用以表示当前有多少个事物想令此对象继续存活下去。这在Objective-C中叫做“保留计数”,即引用计数(retain count)。
(1)、alloc、new、retain、copy、mutableCopy:retain count 递增(+1);
(2)、release、autorelease:retain count 递减(-1);
2、以ARC简化引用计数
ARC只负责管理Objective-C对象的内存。尤其注意:CoreFoundation对象不归ARC管理,开发者必须适时调用CFRetain/CFRelease。
3、在dealloc方法中只释放引用并解除监听
1、在dealloc 方法里,应该释放指向其他对象的引用,并取消订阅的KVO或通知,不要做其他的事情。
2、如果对象持有文件描述符等系统资源,那么应该专门编写一个方法来释放此种资源。这样的类要和其使用者约定:用完资源后必须调用close方法。
- (void)close {
/*clean up resource*/
_closed = YES;
}
- (void)dealloc {
if (!_closed ) {
NSLog(@"ERROR: close was not called before dealloc!");
[self close];
}
}
3、执行异步任务的方法不应在dealloc里调用,只能在正常状态下执行的那么方法也不应在dealloc里调用,因为此时对象已处于正在回收的状态了。
4、以弱引用避免保留环
1、弱引用:可以使用unsafe_unretained、weak 修饰,两者的区别如下图:

当指向EOCClassA实例的引用移除后,unsafe_unretained属性仍然指向那个已经回收的实例,而weak属性则指向nil。
5、以“自动释放池块”降低内存峰值
1、创建自动释放池:
@autoreleasepool {
//......
}
使用情景:当循环长度无法预知,需要使用到“自动释放池块”来降低内存峰值。如:
NSArray *dataSource = /*....*/;
NSMutableArray *people = [NSMutableArray new];
for (NSDictionary *record in dataSource) {
@autoreleasepool {
EOCPerson *person = [[EOCPerson alloc] initWithRecord:record];
[people addObject:person];
}
}
网友评论