2

我需要知道我是否正确。应用程序运行正常,但我不确定我是否正确地获取生命周期(泄漏?)。块和ARC的内存管理,泄漏?

注意:仪器看不到泄漏。

的方法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“路径”。

如果我正确读取了文档,该块将在'路径'上执行保留。但是ARC是否会隐式地在这个块的末尾插入一个版本?将是合乎逻辑的,很好。

或者我应该声明'path'为__block并将其分配给nil在我的块的结尾? (手动...)

不知道我明白如何在这种情况下使用__weak。

回答

6

中描述了path变量是好的。但是,您可能需要通过使用参考selfweak来避免保留周期。如果aQueuestrong参考,那么可能会有一个保留周期导致self永远不会被释放。

解决方案:

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

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

    [self.aQueue addOperation:theOp]; 
} 

确保操作不会被调用后,类应该不再存在。

+0

谢谢。问题:如果没有使用ARC,那么'path'变量是否也可以?或者在块的末尾需要'[path release]'? – malaba 2012-02-23 10:12:07

+0

@malaba在有或没有ARC的情况下,路径变量都很好,因为块会为你保留路径并在块被释放/超出范围时释放它。 – Joe 2012-02-23 14:08:15

3

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

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