ios内存管理--知识

毛奇

普鲁士的胜利,早在小学教师的讲台上就决定了。

俾斯麦

我们德国人,除了上帝谁也不怕,但正是因为对上帝的敬畏,使我们珍爱并维护和平。

个人github:https://github.com/zxpLearnios?tab=repositories

1. 怎么使用autorelease pool

@autoreleasepool{
// code here
}
注意:由于@autoreleasepool同时兼容MRC和ARC编译环境(NSAutoreleasePool只能在MRC下使用)

2. 什么时候需要自己手动创建autorelease pool?

1)你写的循环创建了大量临时对象 -> 你需要在循环体内创建一个autorelease pool block并且在每次循环结束之前处理那些autoreleased对象. 在循环中使用autorelease pool block可以降低内存峰值
2)你创建了一个新线程

  1. 当线程开始执行的时候你必须立马创建一个autorelease pool block, 否则你的应用会造成内存泄露.

2.1 使用场景 :

  1. 利用@autoreleasepool优化循环,
  2. 如果你的应用程序或者线程是要长期运行的并且有可能产生大量autoreleased对象, 你应该使用autorelease pool blocks
  3. 长期在后台中运行的任务, 方法

这里介绍一种特殊的情况:

😯

先上苹果官方源码

– (id)findMatchingObject:(id)anObject {
id match;
while (match == nil) {
@autoreleasepool {
 match = [self expensiveSearchForObject:anObject];
  if (match != nil) {
    [match retain]; /Keep match around./
 }
  }
   }
   return [match autorelease]; /Let match go and return it./
}

在block结束之后, 你要注意的是任何autoreleased对象已经被处理过了(release). 请不要对这个对象发送消息或者把这个对象当做方法的返回值返回. 会引发野指针错误.
解决方法 : 苹果是这么做的 : 在block内对match对象发送retain消息和在block外对match发送autorelease消息能延长match对象的生命周期并且允许match对象在block外部接收消息或者作为方法的返回值返回. 我们不需要再关心match什么时候释放, 因为它已经交给了上一层的autorelease pool去管理.

推荐阅读更多精彩内容