【发布时间】:2014-10-10 23:38:54
【问题描述】:
自从更新到 xcode6 iOS8 后,我发生了崩溃。日志是“ 2014-09-28 14:53:34.069 ViewDemo[35448:3262351] * 由于未捕获的异常“NSInternalInconsistencyException”而终止应用程序,原因:“RedView 类的实例 0x7f9750c1c410 已被释放,而键值观察者仍向其注册.当前观察信息:( 上下文:0x0,属性:0x7f9750c1b910> )' * 首先抛出调用栈: (
0 CoreFoundation 0x00000001022e93f5 __exceptionPreprocess + 165
1 libobjc.A.dylib 0x0000000101f82bb7 objc_exception_throw + 45
2 CoreFoundation 0x00000001022e932d +[NSException raise:format:] + 205
3 Foundation 0x0000000101b65af2 NSKVODeallocate + 317
4 UIKit 0x000000010273fc97 -[UIView(Hierarchy) removeFromSuperview] + 633
5 UIKit 0x0000000102733d19 -[UIView dealloc] + 404
6 libobjc.A.dylib 0x0000000101f978cd _ZN12_GLOBAL__N_119AutoreleasePoolPage3popEPv + 591
7 CoreFoundation 0x00000001021e0346 _CFAutoreleasePoolPop + 22
8 CoreFoundation 0x0000000102214473 __CFRunLoopRun + 2051
9 CoreFoundation 0x0000000102213a06 CFRunLoopRunSpecific + 470
10 GraphicsServices 0x00000001058b19f0 GSEventRunModal + 161
11 UIKit 0x00000001026d5550 UIApplicationMain + 1282
12 ViewDemo 0x0000000101a53657 main + 103
13 libdyld.dylib 0x0000000104861145 start + 1
) libc++abi.dylib:以 NSException 类型的未捕获异常终止
"
这是我从my demo 复制的日志。 看起来 addObserver 操作打破了关于超级视图和子视图的关系。当superview dealloc时,subviews没有先dealloc。
有人对此有意见吗?
【问题讨论】:
-
您应该在
dealloc方法中从 RedView 中删除观察者。 -
有一个类似的问题,尝试在添加和删除观察者时记录对象哈希。有可能你添加了两次观察者,只删除了一次(甚至可能无法删除两次)
-
你在哪里添加/删除观察者? (即代码中的位置)。
-
你能解决这个问题吗?