NSBlockOperation 泄露 ARC

Tom*_*min 2 iphone objective-c nsblockoperation

我在引用块本身内的 \xc2\xb4NSBlockOperation\xc2\xb4 时遇到麻烦。我需要检查操作是否被取消,并且似乎在启用 ARC 的项目中运行时,对 \xc2\xb4searchOperation\xc2\xb4 的任何访问都会泄漏。

\n\n

这段代码基本上什么也不做,在启用 ARC 的项目中显示了泄漏,而在非 ARC 项目中则工作正常。

\n\n
- (void)viewDidLoad\n{\n    [super viewDidLoad];\n\n    self.searchQueue = [[NSOperationQueue alloc] init];\n    self.searchQueue.maxConcurrentOperationCount = 1;\n\n    __block NSBlockOperation *searchOperation = [NSBlockOperation blockOperationWithBlock:^{\n        if (searchOperation.isCancelled) return;\n    }];\n\n    [self.searchQueue addOperation:searchOperation];\n}\n
Run Code Online (Sandbox Code Playgroud)\n\n

谢谢。

\n

Jon*_*hon 5

您已声明 searchOperation 以__weak避免保留循环:

__weak NSBlockOperation *searchOperation;
NSBlockOperation *tmp = [NSBlockOperation blockOperationWithBlock:^{
    if (searchOperation.isCancelled) return;
}];
searchOperation = tmp;
Run Code Online (Sandbox Code Playgroud)

另一种可能的解决方案:使用后在块内将 searchOperation 设置为 nil 。