Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/111.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 非平凡循环中的块_Ios_Objective C_Memory Management_Automatic Ref Counting_Objective C Blocks - Fatal编程技术网

Ios 非平凡循环中的块

Ios 非平凡循环中的块,ios,objective-c,memory-management,automatic-ref-counting,objective-c-blocks,Ios,Objective C,Memory Management,Automatic Ref Counting,Objective C Blocks,我读了下面的内容,但我对下面的段落有点困惑 苹果的文档中说,“对于非平凡的周期,您应该使用”这种方法: 首先,这个例子在我看来是错误的。自我是怎样的 如果块本身保留在 completionHandler属性?completionHandler属性可以是 声明为分配或不安全\u未恢复以允许对象 块传递后解除分配。我看不出原因 谢谢你这么做。如果其他对象需要对象(自身),则块 传递的对象应保留对象,从而保留块 不应指定给属性。不应使用弱/强用法 他可能卷入这件案子 他说,“如果其他对象需要对象(自身

我读了下面的内容,但我对下面的段落有点困惑

苹果的文档中说,“对于非平凡的周期,您应该使用”这种方法:

首先,这个例子在我看来是错误的。自我是怎样的 如果块本身保留在 completionHandler属性?completionHandler属性可以是 声明为分配或不安全\u未恢复以允许对象 块传递后解除分配。我看不出原因 谢谢你这么做。如果其他对象需要对象(自身),则块 传递的对象应保留对象,从而保留块 不应指定给属性。不应使用弱/强用法 他可能卷入这件案子

  • 他说,“如果其他对象需要对象(自身):” 他在这里所说的“需要”是什么意思?是这样的吗:他们需要self,因为他们访问需要self的块(传递给他们的块),所以他们需要self。如果不是,他是什么意思

  • 然后,他说,“因此,不应将该地块指定给某个属性。” 但是,如果有多个对象在将来某个未定义的时间需要块,该怎么办?因此,我们可以通过从这个属性获取来将块传递给他们


  • 我是否采取了错误的方式?

    块保留了其中提到的变量,以便它们可以在第一次出现的上下文中执行。当其中一个保留的块变量直接(平凡)或间接(非平凡)保留块时,您将得到一个循环

    例如,当objectA拥有一个提到objectA的块时,我们会得到一个简单的循环:objectA->block->objectA

    // objectA owns a block property (declared as copy) called theBlock
    objectA.theBlock = ^{
        // anything in the current scope can be mentioned safely in here, except:
        [objectA doSomething];
    };
    
    这篇文章的建议应该是通过在块中使用objectA指针的未恢复副本来打破保留周期

    __unsafe_unretained ObjectAType *objectAUnretainedCopy = objectA;
    // in an ARC project, @Rob points out that this is probably better qualified as __weak
    objectA.theBlock = ^{
        // now we can mention anything in the current scope, including:
        [objectAUnretainedCopy doSomething];
    };
    
    现在objectA仍然保留块,但此改进的块不保留objectA

    一个非平凡的周期也是如此,只是拥有更长的所有权链,这使得周期更难识别。假设objectB保留一个指向objectA的保留(强)指针

    objectB.myObjectA = objectA;
    
    现在,在objectA的块中提到objectB是错误的,因为最终会出现一个循环: objectB->objectA->theBlock->objectB

    objectA.theBlock = ^{
        // anything in the current scope can be mentioned safely in here, except:
        [objectB doSomething];
    };
    
    同样的解决方案也适用。不要直接引用objectB,而是使用未保存的副本

    __unsafe_unretained ObjectBType *objectBUnretainedCopy = objectB;
    // again, per @Rob, or __weak
    

    这篇文章的作者有点困惑,有些东西倒过来了

    如果块本身是空的,那么如何释放和清除self 是否保留在completionHandler属性中

    如果块保留在
    completionHandler
    中,这意味着
    self
    对该块有一个强引用,这意味着只要
    self
    处于活动状态,该块就处于活动状态,而不是相反。
    self
    保留块与
    self
    是否被解除分配无关

    completionHandler属性可以声明为assign或assign 不安全\u未恢复以允许在 这个街区到处都是

    同样,
    completionHandler
    是强引用还是弱引用会影响块的生存期。它与
    self
    的生命周期指向的对象无关

    如果其他对象需要对象(自身),则传递的块 周围应保留对象,因此不应删除块 分配给财产的

    否。对象将保留块。块不保留对象


    在大多数情况下,是否需要代码示例中显示的模式是非常有争议的。然而,作者的推理是错误的。

    请参考下面的博客,这是有意义的。它正在以一种更好的方式解释它


    我认为这篇文章让人困惑。本例中的块不需要
    self
    (顺便说一句,我必须假设
    self
    的意思是
    myController
    )。使用
    weakMyController
    的全部要点是不保留,因此不需要
    self
    。“非平凡块”指的是弱引用被多次使用的块。在这种情况下,您通常希望该引用在块的持续时间内有效。这就是拥有
    MyViewController*strongMyController=weakMyController的原因
    虽然我理解Alberto为什么要与苹果文档中那个糟糕的例子抗争,但他对问题的诊断和对潜在补救措施的分析是有缺陷的。我想知道你为什么建议
    \uuuuuuuunretained
    而不是那篇文章所提倡的
    \uuuuu-weak
    。在这种情况下,我看不出
    \uuuuuuuuuuunsared
    有什么好处,而且我可以设计
    ObjectA
    的实现,这可能会给您带来麻烦(似乎我们不想根据
    ObjectA
    的内部实现细节来编写代码)。仅仅使用
    \uu-weak
    似乎更为谨慎。我养成了使用块预弧的习惯。我想最好改成弱者。(尽管我想不出有哪种发明会坏掉)。我浏览了这篇文章,没有发现它特别清晰。似乎周期应该比作者暗示的更容易描述,更容易治愈。同意所有的观点。如果您想了解如何在本例中使用
    \uuu unsafe\u unretained
    使用
    EXC\u BAD\u ACCESS
    的示例,请告诉我(尽管我们可能希望将其移动到聊天室)。虽然在这种情况下需要一点技巧(部分原因是阿尔贝托(不满意地)与苹果示例代码的认知不一致),但在许多实际场景中,
    \uuuuuunsafe\uunretained
    方法很容易导致问题,而
    弱自我
    /
    强自我
    模式可以简单地避免这些问题。我在文章中显然没有讲清楚,我道歉
    __unsafe_unretained ObjectBType *objectBUnretainedCopy = objectB;
    // again, per @Rob, or __weak