我很确定这是100%安全的,但我不想错过任何东西。我有以下代码
- (void) scheduleControlSurfaceProcess {
[self.operationQueueForMessageProcessing addOperationWithBlock:^{
// do something
[self scheduleControlSurfaceProcess];
}];
}
其中self是Singleton。该块作为非主线程线程非常出色。我没有在profiler中看到任何内存问题(我不太相信)。
所以,我可以忽略警告,“Block会被捕获对象强烈保留的对象保留吗?”如果没有,我怎么能坚持要释放该块(使用ARC )?让警告消失很容易,但分配id what = self
似乎无法解决问题。
编辑:正如我在这个问题上意识到的那么晚,这里真正的问题是我从块内部重新安排。这显然是有问题的,因为每个块都保留了下一个。
注意:我知道有lots of questions on this topic,但我不够专业,不知道哪种情况与此情况类似。
答案 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的引用。