ios autorelease
2015-07-02 16:26
190 查看
MRC时代我们可以在创建对象的时候给对象发送“ autorelease ”消息,然后当NSAutoreleasePool 结束的时候,“标记过”autorelease的对象都会被“ release ”掉,也就是会被释放掉。
但是在ARC时代,我们不用手动发送 autorelease 消息,ARC会自动帮我们加。而这个时候, @autoreleasepool{} 做的事情,跟 NSAutoreleasePool 就一模一样了。
一个比较大的图片对象,临时的,是在一个循环里,要多次初始化的,用了autorelease,但是循环结束以后,在循环外还是可以看到最后一次的那个对象没被释放。我怀疑其他的对象也没被释放。。。但是我希望在循环以外,这些就被释放啊。。。
autorelease到底会在什么时候释放呢?
iOS的运行时是由一个一个runloop组成的,每个runloop都会执行下图的一些步骤:
可以看到,每个runloop中都创建一个Autorelease Pool,并在runloop的末尾进行释放,
所以,一般情况下,每个接受autorelease消息的对象,都会在下个runloop开始前被释放。也就是说,在一段同步的代码中执行过程中,生成的对象接受autorelease消息后,一般是不会在代码段执行完成前释放的。
当然也有让autorelease提前生效的办法:自己创建Pool并进行释放
上面的array就会在[pool drain]执行时被释放。
所以对于你遇到的问题,可以在for循环外嵌套一个Autorelease Pool进行管理,例如
但由于你提到了生成的每个实例可能会比较大。只在循环外嵌套,可能导致在pool释放前,内存里已经有10000个实例存在,造成瞬间占用内存过大的情况。
因此,如果你的每个实例仅需要在单次循环过程中用到,那么可以考虑可以在循环内创建pool并释放
但是在ARC时代,我们不用手动发送 autorelease 消息,ARC会自动帮我们加。而这个时候, @autoreleasepool{} 做的事情,跟 NSAutoreleasePool 就一模一样了。
一个比较大的图片对象,临时的,是在一个循环里,要多次初始化的,用了autorelease,但是循环结束以后,在循环外还是可以看到最后一次的那个对象没被释放。我怀疑其他的对象也没被释放。。。但是我希望在循环以外,这些就被释放啊。。。
autorelease到底会在什么时候释放呢?
iOS的运行时是由一个一个runloop组成的,每个runloop都会执行下图的一些步骤:
可以看到,每个runloop中都创建一个Autorelease Pool,并在runloop的末尾进行释放,
所以,一般情况下,每个接受autorelease消息的对象,都会在下个runloop开始前被释放。也就是说,在一段同步的代码中执行过程中,生成的对象接受autorelease消息后,一般是不会在代码段执行完成前释放的。
当然也有让autorelease提前生效的办法:自己创建Pool并进行释放
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; NSArray * array = [[[NSArray alloc] init] autorelease]; [pool drain];
上面的array就会在[pool drain]执行时被释放。
所以对于你遇到的问题,可以在for循环外嵌套一个Autorelease Pool进行管理,例如
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; for (int i = 0; i < 10000; i++) { // ... } [pool drain];
但由于你提到了生成的每个实例可能会比较大。只在循环外嵌套,可能导致在pool释放前,内存里已经有10000个实例存在,造成瞬间占用内存过大的情况。
因此,如果你的每个实例仅需要在单次循环过程中用到,那么可以考虑可以在循环内创建pool并释放
for (int i = 0; i < 10000; i++) { NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; // ... [pool drain]; }
相关文章推荐
- 调试大法,欲练此功,必须秃头!
- iOS音乐播放器的后台播放和远程控制
- 添加第三方后无法用#import""引出
- iOS集成支付宝问题
- 修改 editButtonItem.title
- iOS 根据Date获取x分钟前/x小时前/昨天/x天前/x个月前/x年前
- iOS手势
- iOS应用开发 iOS开发 iOS软件定制
- iOS 类增加成员变量
- IPHONE IOS6 模拟器没有HOME按键解决方法
- iOS进度条
- iOS 在imageview中添加按钮 并能响应消息 响应者链条
- iOS block简介和使用(一)
- iOS开发范例实战宝典(基础篇)
- 修正iOS从照相机和相册中获取的图片方向(转)
- 连载七 奖学金文章更新 张文军 北京IOS第38期学员
- iOS获取图片并上传
- iOS 学习资料整理(中文版)
- iOS 总结一些还不错的参考资料
- iOS接入Paypal支付的一些需要注意的地方