写高质量OC代码52建议总结:34.以“自动释放池块”降低内存峰值
2017-05-11 09:16
344 查看
释放对象的方式有两种,一种是使用release,另一种是调用autorelease,将其加入自动释放池。自动释放池用于存放那些需要在稍后某个时刻释放的对象。清空自动释放池时,系统会向池中的对象发送release消息。
如果在没有创建自动释放池的情况下给对象发送release消息,控制台会输出警告消息。一般情况下不需要担心自动释放池的问题。系统会自动创建一些线程,这些线程默认都有自动释放池,每次执行事件循环的时候都会将其清空,所以,不需要自己创建自动释放池。
自动释放池可以套嵌,系统在自动释放对象的时候,会把它放在最内层的池里,可以借此控制应用程序的内存峰值,使其不至于过高。
在执行for循环的时候,应用程序所占内存就会持续上涨,所有临时对象都释放后,内存又会突然下降。
总结:
1.自动释放池排布在栈中,对象收到autorelease消息后,系统将其放入最顶端的池里。
2.合理运用自动释放池,可降低应用程序的内存峰值。
3.@autoreleasepool这种新式写法能创建出更轻便的自动释放池。
如果在没有创建自动释放池的情况下给对象发送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这种新式写法能创建出更轻便的自动释放池。
相关文章推荐
- OC高效率52之以“自动释放池块”降低内存峰值
- 写高质量OC代码52建议总结:31.在dealloc方法中只释放引用并解除监听
- 写高质量OC代码52建议总结:36.不要使用retainCount
- 写高质量OC代码52建议总结:39.用handler块降低代码分散程度
- 写高质量OC代码52建议总结:32.编写“异常安全代码”时留意内存管理问题
- 写高质量OC代码52建议总结:33.以弱引用避免保留环
- 编写高质量OC代码52建议总结:20.为私有方法加前缀
- 编写高质量OC代码52建议总结:24.将类的实现代码分散到便于管理的数个分类中
- 编写高质量OC代码52建议总结:16.提供“全能初始化方法”
- 写高质量OC代码52建议总结:42.多用GCD,少用performSelector系列方法
- 写高质量OC代码52建议总结:28.通过协议提供匿名对象
- 编写高质量OC代码52建议总结:9.以“族类模式“隐藏实现细节
- 编写高质量OC代码52建议总结:26.不要在分类中设置属性
- 写高质量OC代码52建议总结:30.以ARC简化引用计数
- 写高质量OC代码52建议总结:43.掌握GCD及操作队列的使用时机
- 编写高质量OC代码52建议总结:18.尽量使用不可变对象
- 编写高质量代码改善C#程序的157个建议——建议52:及时释放资源
- 编写高质量OC代码52建议总结:17.实现describtion方法
- 编写高质量OC代码52建议总结:22.理解NSCopying协议
- 编写高质量OC代码52建议总结:23.通过委托与数据源协议进行对象间通信