我读了下面的article,但对以下段落有些困惑。
苹果文档说:“但是,对于不重要的周期,应该使用”这种方法:
MyViewController *myController = [[MyViewController alloc] init…];
// ...
MyViewController * __weak weakMyController = myController;
myController.completionHandler = ^(NSInteger result) {
MyViewController *strongMyController = weakMyController;
if (strongMyController) {
// ...
[strongMyController dismissViewControllerAnimated:YES completion:nil];
// ...
}
else {
// Probably nothing...
}
};
首先,这个例子对我来说似乎是错误的。自我如何
如果该块本身保留在内存中,则将其释放并清除
completeHandler属性? completeHandler属性可以是
声明为assign或unsafe_unretained以允许对象
块通过后释放。我看不出原因
为此。如果其他对象需要该对象(自己),则该块
被传递的对象应该保留该对象,因此该块
不应分配给属性。不应使用_weak / _strong用法
参与这种情况。
他在这里需要是什么意思?是这样的:他们需要自我,因为他们访问需要自我的块(传递给他们的块),所以他们需要自我。如果不是,那是什么意思?
但是如果将来有多个对象需要该块的时间不确定,该怎么办?因此,我们可以通过从此属性获取将块传递给他们。
我把事情弄错了吗?
最佳答案
这篇文章的作者有些困惑,并且有些倒退。
如果块本身是,如何将自我释放并消灭
保留在complementHandler属性中?
如果该块保留在completionHandler
中,则意味着self
对该块有很强的引用,这意味着只要self
存在,该块就处于 Activity 状态-并非相反。该self
保留该块与是否已释放self
无关。
可以将completedHandler属性声明为assign或
unsafe_unretain允许在释放对象后释放对象
块被传递。
同样,completionHandler
是强引用还是弱引用都会影响块的生存期。它与self
的生存期指向的对象无关。
如果其他对象需要该对象(自己),则传递的块
周围应保留物体,因此不应
分配给属性。
否。对象保留该块。该块不保留对象。
在大多数情况下是否需要代码示例中显示的模式是有争议的。但是,作者的推理是错误的。
关于ios - 非平凡循环中的块,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/20619183/