iphone - [UIViewController 哈希] : message sent to deallocated instance with ARC

标签 iphone automatic-ref-counting ios5

无法解决这个问题,[UIViewController 哈希] 被发送到已正确释放的 View Controller ,它被推送到导航上,然后弹出,然后在稍后的某个随机点发生这种情况。看起来 UIViewController 类有某种 View Controller 的静态集合,其中对旧 Controller 的引用尽管已被删除,但仍然保留。

 206, stop reason = EXC_BREAKPOINT (code=EXC_I386_BPT, subcode=0x0)
    frame #0: 0x0225cdee CoreFoundation`___forwarding___ + 206
    frame #1: 0x0225ccb2 CoreFoundation`_CF_forwarding_prep_0 + 50
    frame #2: 0x017e1cd1 Foundation`objectHash + 33
    frame #3: 0x017e3444 Foundation`hashProbe + 47
    frame #4: 0x017f5d03 Foundation`-[NSConcreteHashTable hashGrow] + 217
    frame #5: 0x017e3407 Foundation`-[NSConcreteHashTable addObject:] + 136
    frame #6: 0x00f98089 UIKit`+[UIViewController setViewController:forView:] + 101
    frame #7: 0x00f94c71 UIKit`-[UIViewController setView:] + 542
    frame #8: 0x017ecf30 Foundation`_NSSetUsingKeyValueSetter + 77
    frame #9: 0x017ecedb Foundation`-[NSObject(NSKeyValueCoding) setValue:forKey:] + 287
    frame #10: 0x01807d50 Foundation`-[NSObject(NSKeyValueCoding) setValue:forKeyPath:] + 393
    frame #11: 0x010ef71a UIKit`-[UIRuntimeOutletConnection connect] + 106
    frame #12: 0x022f7dea CoreFoundation`-[NSObject performSelector:] + 58
    frame #13: 0x022617f1 CoreFoundation`-[NSArray makeObjectsPerformSelector:] + 273
    frame #14: 0x010ee26e UIKit`-[UINib instantiateWithOwner:options:] + 1178
    frame #15: 0x00f941fc UIKit`-[UIViewController _loadViewFromNibNamed:bundle:] + 286
    frame #16: 0x00f94779 UIKit`-[UIViewController loadView] + 302

看起来像从 [UIViewController setView:] 调用的私有(private)方法 [UIViewController setViewController:forView:] 将每个 View Controller 存储在 View -> View Controller 的类级字典中。在稍后的某个时刻,当向集合添加另一个 VC 时,它需要增长,这会导致集合中的所有值被重新散列,从而导致 [UIViewController hash] 调用已释放的 VC。现在的问题是为什么 VC ref 还在那里?也许是因为在没有 Controller 委托(delegate)的情况下 View 仍然处于事件状态。

更新:我可以确认,尽管 VC 已被销毁,但在弹出 VC 后, View Controller 的 View 仍然存在。但不太清楚为什么。

最佳答案

您没有给出太多内容,但如果 ARC 已释放 View Controller ,我们可以(合理地)确信不存在对其的强引用。 (这是合理的,因为如果您没有使用正确的命名约定,它可能会自动释放一个不应该的实例。)

此外,由于它发生在一段时间后,我的猜测是第二个 View Controller 启动了一些长时间运行的进程。委托(delegate)指向同一个 View Controller 。

当您弹出 View Controller 时,长时间运行的进程仍在运行,当它完成时,委托(delegate)不再指向正确的对象。

但是,正如我所说,这完全是猜测,因为您没有发布任何代码。

关于iphone - [UIViewController 哈希] : message sent to deallocated instance with ARC,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9865314/

相关文章:

iphone - 将字符串附加到 UILabel 文本?

swift - iOS 13 UISplitView 问题

ios - 从 iOS 6 开始, objective-c 选择器 dealloc 和 release 是否仍在使用?

ios - 删除 MFMailComposer 和 MFMessageComposer 的自定义 UINavigationBar

iphone - 解雇ModalViewController 的问题

ios - NSNotification addObserver/removeObserver 适当的方法来放置它们

iphone - NSInvalidArgumentException',原因 : '-[__NSArrayM objectForKey:]:

ios - 尝试将指针转换为 ARC 下的指针

objective-c - ARCcast - 破解 objc 对象内存

iphone - 在iPhone中解析XML(归属未分离)