哪些对象弱引用了我的 ViewController?
Which objects reference my ViewController weakly?
我曾经在我的一个 ViewController 中有一个保留周期,但经过大量调试后,我找到了罪魁祸首并修复了它。但是现在,如果有问题的 VC 之前已经存在但被正确处理,我的应用程序就会崩溃,我在 TabBarController 中切换视图。
我启用了 NSZombie 并检查了发送的导致 SIGABRT 的消息。
-[OrderViewController respondsToSelector:]: message sent to deallocated instance 0x151fdc00
在堆栈跟踪中我只找到系统库调用,none 特定于应用程序。
- 框架仍会调用我的 VC 的可能原因是什么?
- 在 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;
}
我曾经在我的一个 ViewController 中有一个保留周期,但经过大量调试后,我找到了罪魁祸首并修复了它。但是现在,如果有问题的 VC 之前已经存在但被正确处理,我的应用程序就会崩溃,我在 TabBarController 中切换视图。
我启用了 NSZombie 并检查了发送的导致 SIGABRT 的消息。
-[OrderViewController respondsToSelector:]: message sent to deallocated instance 0x151fdc00
在堆栈跟踪中我只找到系统库调用,none 特定于应用程序。
- 框架仍会调用我的 VC 的可能原因是什么?
- 在 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;
}