【问题标题】:Getting "observationInfo" in iOS 6 SDK changes retainCount of object在 iOS 6 SDK 中获取“observationInfo”会更改对象的 retainCount
【发布时间】:2012-12-10 06:11:33
【问题描述】:

我需要我的类的实例本身的观察属性,所以我设置了观察:

[self addObserver:self forKeyPath:@"myProperty" options:NSKeyValueObservingOptionNew context:nil]

而在 dealloc 中只需检查并删除观察者:

- (void)dealloc
{
    if ([self observationInfo])
    {
        [self removeObserver:self];
    }
}

此项目在 ARC 下,在 iOS 6 SDK 之前一切正常。但是在 iOS 6 SDK 中,获得observationInfo 会增加对象的retainCount,并且在dealloc 使用EX_BAD_ACCESS(释放消息发送到释放的实例)之后应用程序崩溃。

这段代码有什么问题?是苹果的BUG还是我的?

更新 有堆栈跟踪:

thread #1: tid = 0x1f03, 0x016b60ab libobjc.A.dylib`objc_release + 27, stop reason = EXC_BAD_ACCESS (code=1, address=0xff000002)

frame #0: 0x016b60ab libobjc.A.dylib`objc_release + 27
frame #1: 0x016b6bd9 libobjc.A.dylib`(anonymous namespace)::AutoreleasePoolPage::pop(void*) + 555
frame #2: 0x02538468 CoreFoundation`_CFAutoreleasePoolPop + 24
frame #3: 0x0253cafd CoreFoundation`__CFRunLoopRun + 1933
frame #4: 0x0253bf44 CoreFoundation`CFRunLoopRunSpecific + 276
frame #5: 0x0253be1b CoreFoundation`CFRunLoopRunInMode + 123
frame #6: 0x024f07e3 GraphicsServices`GSEventRunModal + 88
frame #7: 0x024f0668 GraphicsServices`GSEventRun + 104
frame #8: 0x0022e65c UIKit`UIApplicationMain + 1211
frame #9: 0x00001efd MyProjects`main + 141 at main.m:16

【问题讨论】:

  • 信息不足,无法继续。首先,retainCount 没用,没有帮助。其次,如果发生崩溃,请发布回溯。
  • 我添加了stacktrace,它只是自动释放池清理。我的观点是获取observationInfo 的问题。每次调用 [self observationInfo] 都会改变 self.retainCount (增加它,仅在 iOS 6 SDK 中)。我认为这是非常奇怪的行为,没有这个检查一切正常。
  • 您是否有理由观察属性而不是简单地覆盖设置器?
  • 有很多变通方法可以解决这个问题,但是为什么会出现这个问题呢?

标签: objective-c ios6 automatic-ref-counting key-value-observing


【解决方案1】:

当您调用[self observationInfo] 时,它会保留并自动释放self。但是由于您已经在dealloc 中,因此该对象将在自动释放池耗尽之前被释放。因此,当自动释放池最终耗尽时,它会尝试释放您现在释放的对象并崩溃。您可以在堆栈跟踪中看到这一点。第 2 帧是对 CFAutoreleasePoolPop 的调用,这是一个耗尽自动释放池的函数。

【讨论】:

    【解决方案2】:

    -observationInfo 不是为此而设计的。如果您确实需要知道是否设置了 KVO,请将某种标志存储为实例变量

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-08-06
      • 1970-01-01
      • 1970-01-01
      • 2013-04-13
      • 2011-11-13
      • 1970-01-01
      • 2013-07-09
      相关资源
      最近更新 更多