哪些对象弱引用了我的 ViewController?

Which objects reference my ViewController weakly?

我曾经在我的一个 ViewController 中有一个保留周期,但经过大量调试后,我找到了罪魁祸首并修复了它。但是现在,如果有问题的 VC 之前已经存在但被正确处理,我的应用程序就会崩溃,我在 TabBarController 中切换视图。

我启用了 NSZombie 并检查了发送的导致 SIGABRT 的消息。

-[OrderViewController respondsToSelector:]: message sent to deallocated instance 0x151fdc00

在堆栈跟踪中我只找到系统库调用,none 特定于应用程序。

  1. 框架仍会调用我的 VC 的可能原因是什么?
  2. 在 Xcode 中有没有办法查看哪些对象对 VC 的这个特定实例具有弱引用?

如果您的视图控制器是任何其他对象的委托,请在视图控制器的 dealloc 中将该委托 属性 设置为 nil。

我找到了调试方法。

找到罪魁祸首

  • 放置异常断点
  • 重现崩溃
  • 在堆栈跟踪中,单击第一个 non __forwarding__ 问题
  • 通过在控制台中输入 Xcode 来查找 cuplrit:(lldb) register read

通用寄存器

ebx = 0x790257a0
edi = 0x01119988  "tabBarController: shouldSelectViewController:"
esi = 0x08a1fad1  "delegate"
ebp = 0xbfff8778
esp = 0xbfff8740
eip = 0x0099415c  UIKit`-[UITabBarController _tabBarItemClicked:] + 102 10 registers were unavailable.

edi = 已发送的消息, esi = 您向其发送消息的对象, eip = 发送消息的原因。

这为您提供了 nil 消息发送到何处的信息。

解决方案

后来才发现这个问题。我在 ViewDidDisappear 中取消了委托,但本应在 ViewWillDisappear 中这样做,因为我使用的指针在 ViewDidDisappear 中不再有效。

此代码无效。在这种情况下,self.tabBarController 已经是 nil,所以我不能使用此引用来使委托无效。

- (void)viewDidDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    self.tabBarController.delegate = nil;
}

此代码确实有效。我添加了一个 NSParameterAssert 以在使用前检查引用是否有效。

- (void)viewWillDisappear:(BOOL)animated {
    [super viewWillDisappear:animated];
    NSParameterAssert(self.tabBarController);
    self.tabBarController.delegate = nil;
}