我将ARC添加到正在开发的应用程序中。不幸的是,它崩溃了。我发现将所有应用程序更新到ARC的自动脚本为所有id<protocolName>类型。
-
为什么它不是弱类型?我已经将该应用程序及其所有子项目部署到iOS5,因此我的限定符确实很弱。
-
我的主要问题是,如果我宣布这些代表是强有力的,我将有一个保留周期。如果我不这样做,下次我给他们打电话时,他们就会变成僵尸。我检查了一下,在我的应用程序崩溃之前,代理是NSZombie。
这次崩溃的原因是什么?如何预防?
限定符__unsaf_euntered和week有很多共同点。例如,他们都不会增加保留数量。例如,如果视图控制器将__unsafe_unretained IBOutlet保存到UIView,并且您从视图层次结构中删除了该UIView,则您(假设您没有在其他任何位置保留视图)将减少保留计数,并且很可能会解除锁定UIView。然而,指针仍将指向该位置,并处于悬空状态。不好,但如果你知道发生了什么,也不会有问题。当对象的保留计数为0时,弱属性会使属性无效,从而帮助您避免悬挂指针。
现在,如果你的应用程序崩溃或属性显示为僵尸,那么它们就会被释放——不管是哪个类。
一个不完全正确的说法是,如果您保留该属性,您将创建一个保留循环。虽然有可能创建保留循环,但这实际上取决于您的实现,而不仅仅是属性声明。当你保留一个对象时,你就获得了所有权,在你处理完这个对象之前,通过增加它的保留计数来防止它被释放。如果您的代理在持有弱指针时已被释放,则不会阻止其被释放。我假设您在这里处理模态视图控制器——确切地说是UIPopoverController(只是猜测)。
你应该使用仪器,看看你的物品的生命周期,看看是谁保留/释放了它。知道这一点可能会很有帮助。否则,你可以粘贴一些代码,也许这里会有一个好人帮你找到问题。
欢呼Ronny
花了一些时间,但我解决了它:
-
我将.xcodeproj项目部署到了iOS 5,但目标留在了iOS 4.3部署中。当我修复它时(它在每个目标的"构建设置"中),我可以将所有"__unsaf.unrained"更改为"__weak",将所有"unsaf.undrained"改为"weak"。
-
为了避免保留循环,这些委托应该是弱的,它们不会再是僵尸(因为它们是弱的并且不会被破坏),应用程序也不会再崩溃。
如果我仍在使用iOS4.3-i,并且没有未保留的资格,那么在我不再需要这些代表之后,我只应将其分配为零。