【问题标题】:ios8 crash about addObserver:关于 addObserver 的 ios8 崩溃:
【发布时间】: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 中删除观察者。
  • 有一个类似的问题,尝试在添加和删除观察者时记录对象哈希。有可能你添加了两次观察者,只删除了一次(甚至可能无法删除两次)
  • 你在哪里添加/删除观察者? (即代码中的位置)。
  • 你能解决这个问题吗?

标签: ios8 key-value-observing


【解决方案1】:

当您销毁一个之前添加了观察者的对象时,通常会引发此异常。

要解决此问题,您需要在调用销毁该对象的方法之前对该同一对象调用 removeObserver:forKeyPath:

【讨论】:

  • 我有同样的问题,我确实删除了观察者,但似乎操作系统没有删除它,如果我从不添加它,问题就会消失
  • 不确定,尤其是没有任何代码可看,但我会尝试使用 NSNotificationCenter 的 removeObserver: 方法
  • 请参阅我对原始问题的评论。不知何故,我的观察者被注册了两次,但第一个迷失在了一个从未自我解除的边缘
猜你喜欢
  • 2015-02-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多