Ios 非平凡循环中的块
我读了下面的内容,但我对下面的段落有点困惑 苹果的文档中说,“对于非平凡的周期,您应该使用”这种方法: 首先,这个例子在我看来是错误的。自我是怎样的 如果块本身保留在 completionHandler属性?completionHandler属性可以是 声明为分配或不安全\u未恢复以允许对象 块传递后解除分配。我看不出原因 谢谢你这么做。如果其他对象需要对象(自身),则块 传递的对象应保留对象,从而保留块 不应指定给属性。不应使用弱/强用法 他可能卷入这件案子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未恢复以允许对象 块传递后解除分配。我看不出原因 谢谢你这么做。如果其他对象需要对象(自身),则块 传递的对象应保留对象,从而保留块 不应指定给属性。不应使用弱/强用法 他可能卷入这件案子 他说,“如果其他对象需要对象(自身
我是否采取了错误的方式?块保留了其中提到的变量,以便它们可以在第一次出现的上下文中执行。当其中一个保留的块变量直接(平凡)或间接(非平凡)保留块时,您将得到一个循环 例如,当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