4

给定以下类别定义,我如何在有和没有 ARC 的情况下处理 -dealloc?我目前正在使用 ARC,据我所知并在 Instruments 中四处寻找,正在清理这些属性,但我对此不是 100% 有信心。

@interface NSObject (SuperUsefulThingIWishAllNSObjectsHad)
@property (nonatomic, copy) NSString *foo;
@end

#import <objc/runtime.h>
@implementation NSObject (SuperUsefulThingIWishAllNSObjectsHad)
static const void *MyPropertyKey = &MyPropertyKey;
@dynamic foo;
- (NSString *)foo
{
    return objc_getAssociatedObject(self,
                                    MyPropertyKey);
}

- (void)setFoo:(NSString *)foo
{
    objc_setAssociatedObject(self,
                             MyPropertyKey,
                             foo,
                             OBJC_ASSOCIATION_COPY);
}

这更多是为了我自己的启迪,但如果解决方案不是老套,我可能有一些地方我真的想使用它。

4

1 回答 1

5

你不需要做任何特别的事情dealloc来“清理”一个关联的对象。运行时会为您处理它。这与 ARC 无关。

如果您使用 ARC,则需要确保调用[super dealloc]自己的dealloc覆盖。但是无论您使用关联对象,您都需要这样做,如果您忘记了,编译器会警告您。

更新

回应您的评论:您是对的,Objective-C 运行时参考没有明确说明在释放主对象时释放关联的对象(如果适当的话,基于关联策略)。但这是唯一合理的动作,因为关联对象的目的是在不更改主对象源代码的情况下将附属对象附加到主对象。

无论如何,Objective-C 运行时的源代码是开源的,所以我们可以检查它以验证这确实是实现的。

看看,NSObject.mm你会看到-[NSObject dealloc]调用_objc_rootDealloc,调用object_dispose

object_dispose函数在,objc-runtime-new.mm它调用objc_destructInstance,它调用_object_remove_assocations

_object_remove_assocations函数(是的,它在源代码中有错字)位于objc-references.mm. 它删除与被释放对象关联的所有对象,并在适当时释放它们。如果您查看objc_removeAssociatedReferences它是公共 API 的一部分并在 中定义objc-runtime.m,您会发现它也调用了_object_remove_assocations.

于 2013-03-07T16:52:07.113 回答