【问题标题】:Custom NSOperations autorelease pool自定义 NSOperations 自动释放池
【发布时间】:2012-09-25 17:20:45
【问题描述】:
我已经实现了NSOperation 的一些自定义子类以在队列中使用。
我应该(或可以)在哪里设置@autoreleasepool?
在我的自定义操作的main 方法中?
或者围绕我将操作添加到队列实例的语句?
编辑:
如果我使用块添加操作怎么办? @autoreleasepool 也应该进入街区吗?
如果相关,我正在使用 ARC。
【问题讨论】:
标签:
ios
nsoperation
nsautoreleasepool
【解决方案1】:
使用自动释放池的主要原因是防止临时不需要的对象大量聚集。例如,假设您的操作打开一堆图像,提取其中的一些片段(保存在 NSData 对象中),然后作为最后一步将新片段转换为图像。
在这种情况下,我会做的是将打开和提取部分放在自动释放池中(确保 NSData 对象被正确保留),然后在创建和保存新图像之前退出它。这样一来,所有打开的图像都肯定会被释放。
据我所知,通常没有理由在操作中使用自动释放池,因为一旦操作完成,队列最像在当时或之后不久进行。
事实上,使用 ARC,编译器有时会将对象从自动释放池中拉出,然后保留,然后在不需要时直接释放它们。
除非您已知迫切需要游泳池,否则我不会使用游泳池。现在,如果您使用带有 'start' 方法的并发 NSOperation,那就另当别论了,您应该使用池将代码包装在 runloop 周围。