【发布时间】:2013-12-16 19:25:49
【问题描述】:
我读到了article,但我对下面的段落有点困惑。
Apple 文档说“但是,对于非平凡的循环,您应该使用”这种方法:
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...
}
};
首先,这个例子在我看来是错误的。自己怎么可能 如果块本身保留在 完成处理程序属性? completionHandler 属性可以是 声明为 assign 或 unsafe_unretained 以允许对象 在块被传递后释放。我看不到原因 这样做。如果其他对象需要该对象(自身),则该块 传递的应该保留对象,因此块 不应分配给属性。不应该使用 _weak/_strong 用法 参与此案。
他说“如果其他对象需要对象(自身):” 他这里的需要是什么意思?是这样的吗:他们需要自我,因为他们访问需要自我的块(传递给他们的块),所以他们需要自我。如果不是,他是什么意思?
然后他说“因此不应将块分配给属性”。 但是,如果有多个对象在未来某个未定义的时间需要阻塞怎么办?因此,我们可以通过从该属性中获取来将块传递给他们。
我是不是搞错了?
【问题讨论】:
-
我认为这篇文章令人困惑。此示例中的块不需要需要
self(顺便说一句,我必须假设self他们的意思是myController)。使用weakMyController的重点不是保留,因此不需要self。 Apple 所说的“非平凡块”是指多次使用弱引用的块。在这种情况下,您通常希望该引用在块的持续时间内有效。这就是拥有MyViewController *strongMyController = weakMyController;的原因 -
虽然我理解为什么 Alberto 对 Apple 文档中那个糟糕的例子感到苦恼,但他对问题的诊断和对潜在补救措施的分析存在缺陷。
标签: ios objective-c memory-management automatic-ref-counting objective-c-blocks