2

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

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

- (void)viewDidLoad
{
    [super viewDidLoad];

    self.searchQueue = [[NSOperationQueue alloc] init];
    self.searchQueue.maxConcurrentOperationCount = 1;

    __block NSBlockOperation *searchOperation = [NSBlockOperation blockOperationWithBlock:^{
        if (searchOperation.isCancelled) return;
    }];

    [self.searchQueue addOperation:searchOperation];
}

谢谢。

4

1 回答 1

4

您已声明 searchOperation__weak以避免保留周期:

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

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

于 2012-05-17T11:10:51.270 回答