【发布时间】:2012-04-09 13:18:29
【问题描述】:
无法解决这个问题,[UIViewController hash] 被发送到已正确释放的视图控制器,它被推送到导航然后随后弹出,然后在某个随机点发生这种情况。看起来 UIViewController 类有某种静态的视图控制器集合,其中对旧控制器的引用仍然被保留,尽管被删除了。
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 setViewController:forView:],从 [UIViewController setView:] 调用,可能将每个视图控制器存储在视图的类级字典中 -> 视图控制器。稍后在向集合中添加另一个 VC 时,它需要增长,这会导致集合中的所有值都被重新散列,从而导致 [UIViewController hash] 调用 delloced VC。现在的问题是为什么 VC ref 还在那里?也许是因为视图在没有控制器委托的情况下仍然存在。
更新:尽管 VC 已被销毁,但在弹出 VC 后,我可以确认视图控制器的视图仍然存在。不过不太清楚为什么。
【问题讨论】:
-
把你的代码放在这里或者自己释放内存而不是ARC
-
这里的代码太多了,为什么还要自己释放内存呢?
-
这里的代码太少,任何人都无法提供太多帮助。
标签: iphone automatic-ref-counting ios5