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
我发现了一个问题的根源 - 我NSZombie在我的项目中启用了这个错误的对象.
据我所知,当启用僵尸对象时,正常实例将NSZombie在取消分配时被替换,但所有关联的对象都保持活动状态!小心那种行为!
我创建了一个rdar:// 10636309
更新:CédricLuthi 有一个解决方法,这个问题似乎在iOS 6中得到修复.
| 归档时间: |
|
| 查看次数: |
4792 次 |
| 最近记录: |