自定义NSOperations自动释放池

时间:2012-09-25 17:20:46

标签: ios nsoperation nsautoreleasepool

我已经实现了一些NSOperation的自定义子类,以便在队列中使用。

我应该(或可以)在哪里设置@autoreleasepool

在我的自定义操作的main方法中?

或者在我将操作添加到队列实例的语句周围?

编辑:

如果我使用块添加操作怎么办? @autoreleasepool也应该进入区块吗?

如果这是相关的,我正在使用ARC。

1 个答案:

答案 0 :(得分:0)

使用自动释放池的主要原因是为了防止临时不需要的对象的大量聚合。例如,假设您的操作打开一堆图像,提取出一些图像(保存在NSData对象中),然后作为最后一步将新图像转换为图像。

在这种情况下,我要做的是将开始和提取部分放在自动释放池中(确保NSData对象被正确保留),然后在创建和保存新图像之前退出。这样,所有打开的图像都会被释放。

我没有理由在操作中通常使用自动释放池,因为一旦操作完成队列,就像当时或之后不久那样。

事实上,对于ARC,编译器有时会将对象从自动释放池中拉出来,然后保留,然后在不需要时直接释放它们。

除非你已经迫切需要一个游泳池,否则我不会使用它。现在,如果您使用带有'start'方法的并发NSOperation,那就是一个不同的故事,您应该使用池将代码包装在runloop周围。