1

我正在拼命寻求帮助,以解决困扰我的事情...

这都在ARC下,顺便说一句。

我有一个配置文件屏幕 (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 解决问题的指示吗?

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

感谢您的任何意见。

4

2 回答 2

2

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

使用 Instruments 记录引用计数操作(分配)——您也可以启用 Zombies。当您的程序停止时,在对象列表中找到您的 VC,并查看记录的该实例的引用计数操作。通常清楚引入不平衡的位置,尽管操作可能比您预期的要多。

于 2013-09-27T21:27:19.970 回答
0

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

@property(nonatomic, strong) SettingsVC *settingsVC;

希望这可以帮助!

于 2013-09-27T21:28:09.777 回答