9

所以我有一个支持 iOS 4 的项目,所以我所有的 IBOutlets__unsafe_unretained甚至是在 nib 中但在控制器主视图之外的 IBOutlets(同一个 nib 中的单独视图)并且都运行良好。

所以时间到了,现在客户只想支持 iOS 5,所以我们的团队更改了所有__unsafe_unretained IBOutlets,__weak IBOutlets但现在不在主视图内的 IBOutlets 设置为nil(除了 in viewdidload),因此我们以后无法添加它们。

如果我考虑一下,这是有道理的,因为如果没有视图(主视图)保留那些 IBOutlets,它们应该被释放并归零(我不知道这是否是正确的词),所以解决方案是__weak从那些IB奥特莱斯

但是对我来说没有意义的是为什么 和 之间的不同行为unsafe_unretainedweak在我的脑海中unsafe_unretained,应该释放它们,当应用程序尝试访问它们时,它们应该指向一个无效的引用,然后应用程序应该崩溃。

我认为 unsafe__unretained 与弱相同,但没有归零。

我在这里错过了什么吗?

谢谢。

4

3 回答 3

5

我认为 unsafe__unretained 与弱相同,但没有归零。

是的,是的。

当 Cocoa 加载 nib 时,它会创建所有自动释放的对象,因此它们在viewDidLoad被调用时仍然存在。但是,自动释放池的生命周期在控制权返回到运行循环时结束。此时,所有不属于任何东西的对象都将消失,因此任何弱出口都将在此时归零。

对于大多数网点来说,这不是问题,因为 NIB 中的对象通常已经由某物拥有。因此,例如,视图中的按钮归其父视图所有。因此,拥有指向该按钮的强大出口是矫枉过正或更糟的可能导致保留周期。

顶级对象显然没有父视图来拥有它们,因此它们需要由其他东西拥有,例如控制器或“文件所有者”。如果你发现东西消失了,你需要在 File 的所有者中为它创建一个强大的 IBOutlet。

有关更多详细信息,请参阅Apple 的文档

于 2012-06-20T15:49:24.777 回答
1

对于遇到这个问题的未来搜索者,我认为 CRD 的Stackoverflow对类似问题的回答可以解释。即使对象已被释放,不安全的未保留指针(包含实际对象数据)所引用的内存也不一定会归零,因此在该内存实际重用/修改/归零之前,事情可能会正常运行。

于 2016-09-03T23:57:43.433 回答
0

你是对的,当试图通过你陈旧的 __unsafe_unretained 引用访问已释放的对象时,应用程序会崩溃。

原因很可能是因为应用程序的某些其他部分正在使用强引用引用这些对象。

尝试在启用僵尸的情况下运行,这会在取消引用假定的陈旧指针时立即导致崩溃。

于 2013-06-06T12:11:14.507 回答