我读了下面的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/

    10-09 15:34