我需要知道我是否正确地做到了。应用程序运行正常,但我不确定我是否正确生效(泄漏?)。
注意:仪器看不到泄漏。
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。
答案 0 :(得分:6)
path
变量很好。但是,您可以使用对weak
的{{1}}引用来避免保留周期。如果self
是aQueue
引用,则可能会有一个保留周期导致strong
永远不会被释放。
解决方案:
self
确保在课程不再存在后不会调用该操作。
答案 1 :(得分:3)
该块将自动处理封闭范围内任何本地人的内存管理。在这种情况下,您不必担心保留/释放对。请注意,虽然path
在块的范围内将是const
。如果您需要path
在块中可变,请使用__block
属性。
详细描述了块处理变量的不同方式here: Blocks and Variables