ios内存管理--知识
2017-09-28 本文已影响51人
zxpzwbs
毛奇
普鲁士的胜利,早在小学教师的讲台上就决定了。
俾斯麦
我们德国人,除了上帝谁也不怕,但正是因为对上帝的敬畏,使我们珍爱并维护和平。
1. 怎么使用autorelease pool
@autoreleasepool{
// code here
}
注意:由于@autoreleasepool同时兼容MRC和ARC编译环境(NSAutoreleasePool只能在MRC下使用)
2. 什么时候需要自己手动创建autorelease pool?
1)你写的循环创建了大量临时对象 -> 你需要在循环体内创建一个autorelease pool block并且在每次循环结束之前处理那些autoreleased对象. 在循环中使用autorelease pool block可以降低内存峰值
2)你创建了一个新线程
- 当线程开始执行的时候你必须立马创建一个autorelease pool block, 否则你的应用会造成内存泄露.
2.1 使用场景 :
- 利用@autoreleasepool优化循环,
- 如果你的应用程序或者线程是要长期运行的并且有可能产生大量autoreleased对象, 你应该使用autorelease pool blocks
- 长期在后台中运行的任务, 方法
这里介绍一种特殊的情况:
😯
先上苹果官方源码
– (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去管理.