NSZombie不会死

时间:2013-09-27 21:08:46

标签: ios objective-c automatic-ref-counting exc-bad-access nszombie

我正在拼命地寻求帮助解决我的问题......

这完全属于ARC,BTW。

我有一个配置文件屏幕(UserProfileVC),然后您单击该屏幕上的按钮,它显示SettingsVC。 SettingsVC保存在UserProfileVC的settingsVC ivar中,当我响应按钮单击时,我检查settingsVC是否为nil,然后从故事板创建它并显示它。

- (IBAction)handleSettingsButtonPressed:(id)sender {
    if (!settingsVC) {
        settingsVC = [self.storyboard instantiateViewControllerWithIdentifier:@"UPSettingsVC"];
        settingsVC.model = self.model;
        settingsVC.horizontalCoverPresentingVC = self;
    }

    [self horizontalCoverTransitionToViewController:settingsVC duration:0.35f];
}

当我解除SettingsVC时,我什么也不做,只是从超级视图中删除视图(这与#horizo​​ntalCoverTransitionToViewController:duration:方法的做法基本相反)。我从来没有把它设置为零。

我可以从UserProfileVC导航到SettingsVC并返回......完全一次。如果我尝试回到SettingsVC,我会点击

if (!settingsVC) {...}

阻止,不要输入(表示settingsVC仍然存在),然后一击,

[self horizontalCoverTransitionToViewController:settingsVC duration:0.35f];

我收到EXC_BAD_ACCESS(code = 1 ...)错误。

如果我打开Zombies,我可以看到SettingsVC已成为Zombie。

我甚至将-fno-objc-arc添加到该类的编译器标志,然后实现#release并在其中添加断点。

从解散SettingsVC的代码中调用该版本,但是我的应用程序中几乎所有其他VC都使用了相同的代码,并且没有一个代码会导致释放。

有人可以告诉我在哪里查看,如何调试,甚至是使用Instruments来解决问题的一些指示?

我开始怀疑一些底层框架错误,但如果我制作一个小样本应用程序来演示问题,它就可以正常工作,所以这个类必须有一些特殊的东西。

感谢您的任何意见。

2 个答案:

答案 0 :(得分:2)

  

如果我打开Zombies,我可以看到SettingsVC已成为Zombie。

使用Instruments记录引用计数操作(Allocations) - 您也可以启用Zombies。程序停止后,在对象列表中找到VC,并查看该实例的记录引用计数操作。通常 非常清楚引入不平衡的地方,尽管可能会有比预期更多的操作。

答案 1 :(得分:0)

我认为问题在于您没有将settingsVC ivar声明为strong属性。根据Apple的内存管理规则,您不拥有- (id)instantiateViewControllerWithIdentifier:(NSString *)identifier返回的View Controller;拥有它你应该声明你的ivar是一个强大的财产。请试一试。

@property(nonatomic, strong) SettingsVC *settingsVC;

希望这有帮助!