在iOS 6 SDK中获取"observationInfo"会更改retainCount对象

0 objective-c key-value-observing automatic-ref-counting ios6

我需要我的类的实例观察它自己的属性,所以我设置观察:

[self addObserver:self forKeyPath:@"myProperty" options:NSKeyValueObservingOptionNew context:nil]
Run Code Online (Sandbox Code Playgroud)

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

- (void)dealloc
{
    if ([self observationInfo])
    {
        [self removeObserver:self];
    }
}
Run Code Online (Sandbox Code Playgroud)

这个项目属于ARC,在iOS 6 SDK之前一切正常.但是使用iOS 6 SDK,observationInfodealloc使用EX_BAD_ACCESS(释放消息发送到解除分配的实例)之后,会增加对象和应用程序的retainCount 崩溃.

这段代码有什么问题?这是Apple的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
Run Code Online (Sandbox Code Playgroud)

rob*_*off 7

当你打电话时[self observationInfo],它会保留并自动释放self.但是,由于您已经进入dealloc,因此在自动释放池耗尽之前,将释放该对象.因此,当自动释放池最终耗尽时,它会尝试释放您现在解除分配的对象并崩溃.您可以在堆栈跟踪中看到这一点.帧#2是一个调用CFAutoreleasePoolPop,它是一个排出自动释放池的函数.