使用块和ARC进行内存管理,泄漏?

时间:2012-02-22 15:53:49

标签: objective-c cocoa-touch cocoa automatic-ref-counting objective-c-blocks

我需要知道我是否正确地做到了。应用程序运行正常,但我不确定我是否正确生效(泄漏?)。

注意:仪器看不到泄漏。

aaa方法的代码:某些A类:

- (void) aaa {
   NSString *path = ...something...;

   NSBlockOperation* theOp = [NSBlockOperation blockOperationWithBlock: ^{
   // using path
   [self somethingElseWith:path];
   }];

   [self.aQueue addOperation:theOp];
}

所以我创建一个块来放置aQueue(NSOperationQueue *)。目标是从主线程卸载长期运行的somethingElseWith:方法,以便GUI继续响应。

在块中,我引用了aaa:方法末尾超出范围的本地var“path”。

如果我正确阅读了文档,该块将在'path'上保留。但ARC是否隐含地在此块的末尾插入了一个版本?这将是合乎逻辑且不错的。

或者我应该将'path'声明为__block并在块的末尾将其指定为nil? (手动...)

我不确定如何在此上下文中使用__weak。

2 个答案:

答案 0 :(得分:6)

path变量很好。但是,您可以使用对weak的{​​{1}}引用来避免保留周期。如果selfaQueue引用,则可能会有一个保留周期导致strong永远不会被释放。

解决方案:

self

确保在课程不再存在后不会调用该操作。

答案 1 :(得分:3)

该块将自动处理封闭范围内任何本地人的内存管理。在这种情况下,您不必担心保留/释放对。请注意,虽然path在块的范围内将是const。如果您需要path在块中可变,请使用__block属性。

详细描述了块处理变量的不同方式here: Blocks and Variables