这样安全吗?单身作为自我在块中的可能保留周期

时间:2011-12-27 16:14:14

标签: ios automatic-ref-counting objective-c-blocks nsoperationqueue

我很确定这是100%安全的,但我不想错过任何东西。我有以下代码

- (void) scheduleControlSurfaceProcess {
    [self.operationQueueForMessageProcessing addOperationWithBlock:^{
        // do something
        [self scheduleControlSurfaceProcess];     
    }];
}

其中self是Singleton。该块作为非主线程线程非常出色。我没有在profiler中看到任何内存问题(我不太相信)。

所以,我可以忽略警告,“Block会被捕获对象强烈保留的对象保留吗?”如果没有,我怎么能坚持要释放该块(使用ARC )?让警告消失很容易,但分配id what = self似乎无法解决问题。

编辑:正如我在这个问题上意识到的那么晚,这里真正的问题是我从块内部重新安排。这显然是有问题的,因为每个块都保留了下一个。

注意:我知道有lots of questions on this topic,但我不够专业,不知道哪种情况与此情况类似。

1 个答案:

答案 0 :(得分:5)

- (void) scheduleControlSurfaceProcess {
    __weak id SELF = self;
    [self.operationQueueForMessageProcessing addOperationWithBlock:^{
        id strongSelf = SELF; //Guarantee self doesn't go away in the meantime
        // do something
        [self.operationQueueForMessageProcessing addOperationWithBlock:^{
            [strongSelf scheduleControlSurfaceProcess]; 
        }];
    }];
}

这样可以保证你不会在这里骑自行车。警告完全有效,自行保留操作队列,队列保留块,块保留自己。我们走了一圈又一圈。

在我修改过的示例中,该块将捕获SELF并将其存储到'strongSelf'中。 strongSelf步骤并不是绝对必要的,但是它会确保在执行块期间不会引用对self的引用。