您的位置:首页 > 编程语言

写高质量OC代码52建议总结:34.以“自动释放池块”降低内存峰值

2017-05-11 09:16 281 查看
释放对象的方式有两种,一种是使用release,另一种是调用autorelease,将其加入自动释放池。自动释放池用于存放那些需要在稍后某个时刻释放的对象。清空自动释放池时,系统会向池中的对象发送release消息。

 如果在没有创建自动释放池的情况下给对象发送release消息,控制台会输出警告消息。一般情况下不需要担心自动释放池的问题。系统会自动创建一些线程,这些线程默认都有自动释放池,每次执行事件循环的时候都会将其清空,所以,不需要自己创建自动释放池。

 自动释放池可以套嵌,系统在自动释放对象的时候,会把它放在最内层的池里,可以借此控制应用程序的内存峰值,使其不至于过高。
for(int i = 0; i < 1000000; i++) {
[self doSomethingWithInt:i];
}
 doSomethingWithInt方法要创建临时对象,这些对象很可能会在自动释放池里,即使这些对象在调用完方法后就不再使用了,它们也依然处于存活状态,等待系统稍后将其释放并回收。然而,自动释放池要等线程执行下一次时间循环时才会清空。

 在执行for循环的时候,应用程序所占内存就会持续上涨,所有临时对象都释放后,内存又会突然下降。
NSArray *databaseRecords = /.../;
NSMutableArray *people = [NSMutableArray new];
for (NSDictionary *record in databaseRecords) {
EOCPerson *person = [[EOCPerson alloc] initWithRecord:record];
[people addObject:person];
}
 EOCPerson的初始化函数也会创建出一些临时对象,它们本应该提早回收,增加一个自动释放池可解决此问题。
NSArray *databaseRecords = /.../;
NSMutableArray *people = [NSMutableArray new];
for (NSDictionary *record in databaseRecords) {
@autoreleasepool {
EOCPerson *person = [[EOCPerson alloc] initWithRecord:record];
[people addObject:person];
}
}
 是否应该用自动释放池来优化效率,完全取决于具体的应用程序。首先监控内存用量,判断其中有没有需要解决的问题,如果没有,就别急着优化。尽管自动释放池的开销不算太大,但毕竟还是有,所以尽量别创建额外的自动释放池。

 总结:

 1.自动释放池排布在栈中,对象收到autorelease消息后,系统将其放入最顶端的池里。

 2.合理运用自动释放池,可降低应用程序的内存峰值。

 3.@autoreleasepool这种新式写法能创建出更轻便的自动释放池。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐