所以我有一个支持iOS 4的项目,所以我的所有IBOutlet都是__unsafe_unretained
甚至是IBOutlets,它们都在nib中但在控制器主视图之外(同一个nib中的Separate View)并且都很好用。 / p>
所以现在是时候了,现在客户想要只支持iOS 5,所以我们的团队改变了__unsafe_unretained
的所有__weak IBOutlets
IBOutlets,但是现在不在主视图中的IBOutlets被设置为nil
(viewdidload
除外)因此我们以后无法添加它们。
如果我考虑一下,这是有道理的,因为如果没有视图(主视图)保留那些IBOutlet,他们应该被解除分配并归零(我不知道这是否是正确的单词),所以解决方案是删除来自那些IBOutlets的__weak
但对我来说没有意义的是为什么unsafe_unretained
和weak
之间的不同行为,在我的脑海中unsafe_unretained
应该被解除分配,并且应用程序尝试访问时他们应该指向无效的引用,然后应用程序崩溃。
我认为不安全的不安全与弱者相同但没有归零。
我在这里错过了什么吗?
感谢。
答案 0 :(得分:5)
我认为不安全的不安全与弱者相同但没有归零。
是的,是的。
当Cocoa加载nib时,它会创建所有自动释放的对象,因此在调用viewDidLoad
时它们仍然存在。但是,自动释放池的生命周期在控制返回到运行循环时结束。此时,所有不属于任何东西的物体都会消失,因此任何弱的出口都会在此时归零。
对于大多数网点而言,这不是问题,因为NIB中的对象通常已经被某些东西所拥有。因此,例如,视图中的按钮由其父视图拥有。因此,具有指向该按钮的强大出口是过度的或更糟的可能导致保留周期。
顶级对象显然没有父视图来拥有它们所以它们需要被其他东西拥有,例如控制器或“文件所有者”。如果你发现东西消失了,你需要在File的所有者中为它创建一个强大的IBOutlet。
有关详细信息,请参阅Apple's docs。
答案 1 :(得分:1)
对于遇到此问题的未来搜索者,我认为CRD Stackoverflow answer对类似的问题可以解释。即使对象已被释放,由不安全的未保留指针(包含实际对象数据)引用的内存也不一定归零,因此在实际重用/修改/归零该内存之前,事情可能看起来正常。
答案 2 :(得分:0)
你是对的,当你试图通过陈旧的__unsafe_unretained引用来访问被解除分配的对象时,应用程序会崩溃。
之所以不是这样的原因很可能是因为应用程序的某些其他部分正在引用具有强引用的对象。
尝试在启用僵尸的情况下运行,这会在取消引用假定过时的指针时立即导致崩溃。