Objective-C相关对象在ARC下泄漏

iHu*_*ter 9 objective-c objective-c-runtime automatic-ref-counting

objc_setAssociatedObject在ARC下遇到了一个奇怪的行为.请考虑以下代码:

static char ASSOC_KEY;

@interface DeallocTester : NSObject
@end

@implementation DeallocTester
- (void) dealloc
{
    NSLog(@"DeallocTester deallocated");
    //objc_setAssociatedObject(self, &ASSOC_KEY, nil, OBJC_ASSOCIATION_RETAIN);
}
@end

@implementation AppDelegate
- (void) applicationDidFinishLaunching:(UIApplication *)application
{
    NSObject *test = [[DeallocTester alloc] init];
    objc_setAssociatedObject(test, &ASSOC_KEY, [[DeallocTester alloc] init],
                             OBJC_ASSOCIATION_RETAIN);
}
Run Code Online (Sandbox Code Playgroud)

我正在创建一个实例DeallocTester,然后我将另一个设置DeallocTester为关联对象,然后它们都超出了范围.

我希望-dealloc第一个对象被调用,然后关联的对象也要被释放,但我看到"DeallocTester deallocated"消息只打印一次.如果我取消注释该objc_setAssociatedObject-dealloc,则第二个对象也会被取消分配.

Objective-C引用声明关联对象在对象销毁时自动解除分配.它是编译器/ ARC /任何问题还是我错过了什么?

更新

如果您从一个全新的项目运行它,这个示例代码实际上是有效的.但我有两个启用ARC的项目.我会做一些调查并提供更好的样本.

更新2

我填写了一个rdar:// 10636309,如果在启用ARC的项目中启用了NSZombie对象,则相关对象泄漏

iHu*_*ter 9

我发现了一个问题的根源 - 我NSZombie在我的项目中启用了这个错误的对象.

据我所知,当启用僵尸对象时,正常实例将NSZombie在取消分配时被替换,但所有关联的对象都保持活动状态!小心那种行为!

我创建了一个rdar:// 10636309

更新:CédricLuthi 有一个解决方法,这个问题似乎在iOS 6中得到修复.