哪些对象弱引用我的ViewController?

时间:2015-07-08 15:07:30

标签: ios objective-c xcode memory-management weak-references

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

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

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

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

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

2 个答案:

答案 0 :(得分:1)

我找到了一种调试方法。

找到罪魁祸首

  • 放置例外断点
  • 重现崩溃
  • 在堆栈跟踪中,单击第一个<tr ng-repeat="country in countries |filter:search "> 问题
  • 通过在Xcode中输入控制台来查找cuplrit:non __forwarding__

通用寄存器

(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 =发送邮件的原因。

这将为您提供发送nil消息的信息。

<强>解决方案

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

此代码不起作用。在这种情况下,ViewDidDisappear已经是零,所以我不能使用此引用来使委托无效。

self.tabBarController

此代码确实有效。在添加引用之前,我添加了- (void)viewDidDisappear:(BOOL)animated { [super viewWillDisappear:animated]; self.tabBarController.delegate = nil; } 来检查引用是否有效。

NSParameterAssert

答案 1 :(得分:0)

If your view controller is a delegate for any other object, set that delegate property to nil inside the view controller's dealloc.