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

mal*_*aba 2 cocoa cocoa-touch objective-c objective-c-blocks automatic-ref-counting

我需要知道我是否正确地做到了.应用程序运行正常但我不确定我的生命周期是否正确(泄漏?).

注意:仪器看不到泄漏.

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

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

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

   [self.aQueue addOperation:theOp];
}
Run Code Online (Sandbox Code Playgroud)

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

在块内部,我引用了aaa:方法末尾超出范围的本地var"path".

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

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

我不确定我是否理解如何在此上下文中使用__weak.

Joe*_*Joe 6

path变量是罚款.但是,您可能需要使用weak引用来避免保留周期self.如果aQueuestrong参考,则可能存在导致self永不释放的保留周期.

解:

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

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

   [self.aQueue addOperation:theOp];
}
Run Code Online (Sandbox Code Playgroud)

确保在该类不再存在后不会调用该操作.