为什么代表应该不安全而不是弱?

时间:2014-01-07 08:20:58

标签: delegates automatic-ref-counting retain-cycle weak unsafe-unretained

我将ARC添加到我正在处理的应用中。不幸的是,它崩溃了。我发现将所有应用程序更新到ARC的自动脚本给了__unsafe_unretained限定符到所有id< protocolName>类型。

  1. 为什么它不是弱类型?我已经将应用程序及其所有子项目部署到iOS 5,因此我确实有弱的限定符。

  2. 我的主要问题是如果我宣布那些代表是强者,我会有一个保留周期。如果我不这样做,下次我打电话给他们时,他们就会变成僵尸。我检查过,在我的应用程序崩溃之前,代表是NSZombie。

  3. 造成这次事故的原因是什么?如何预防?

2 个答案:

答案 0 :(得分:0)

限定词__unsafe_unretained和周有很多共同点。例如,它们都不会增加保留计数。例如,如果视图控制器将__unsafe_unretained IBOutlet保存到UIView并从视图层次结构中删除了非常UIView,那么您(假设您不在其他任何地方保留视图)将减少保留计数并且很可能会释放UIView 。然而,指针仍将指向该位置并保持悬空状态。如果你知道发生了什么,不好,但也没问题。弱属性通过在对象达到保留计数0时使属性无效来帮助您避免悬空指针。

现在,如果您的应用程序崩溃或属性显示为僵尸,那么它们将被释放 - 尽管是哪个类。

一个不完全正确的陈述是,如果您保留该属性,则会创建一个保留周期。有可能创建保留周期,但它实际上取决于您的实现,而不仅仅是属性声明。保留对象时,您将获得所有权,直到完成该对象为止,通过增加其保留计数来防止它被释放。如果您的代表在持有弱指针时已经释放,则不会阻止它被释放。我假设你在这里处理模态视图控制器 - UIPopoverController是准确的(只是一个猜测)。

您应该使用乐器并查看对象的生命周期,并查看谁保留/释放它。知道可能会有所帮助。否则,你可以粘贴一些代码,也许会有一个好人来帮你找到问题。

欢呼声 罗尼

答案 1 :(得分:0)

花了一些时间,但我解决了它:

  1. 我将.xcodeproj项目部署到iOS 5,但目标仍留在iOS 4.3部署中。当我修复它时(它在每个目标的“构建设置”中) - 我可以将所有'__unsafe_unretained'更改为'__weak',并将所有'unsafe_unretained'更改为'weak'。

  2. 为了避免保留周期,这些代表应该是弱的,他们不再是僵尸(因为它们很弱而且不安全),并且应用程序不会再崩溃。

  3. 如果我还在使用iOS4.3-,并且没有unsafe_unretained qualifer,我应该只在我不再需要它们之后给那些代表分配nil。