Objective c 如何释放在运行时添加到类别中的属性?
根据以下类别定义,我可以如何处理-dealloc(带弧和不带弧)?我目前正在使用ARC,据我所知,我在仪器中四处走动,这些属性正在清理,但我对此没有100%的信心Objective c 如何释放在运行时添加到类别中的属性?,objective-c,cocoa,Objective C,Cocoa,根据以下类别定义,我可以如何处理-dealloc(带弧和不带弧)?我目前正在使用ARC,据我所知,我在仪器中四处走动,这些属性正在清理,但我对此没有100%的信心 @interface NSObject (SuperUsefulThingIWishAllNSObjectsHad) @property (nonatomic, copy) NSString *foo; @end #import <objc/runtime.h> @implementation NSObject (Sup
@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);
}
@接口NSObject(超级有用的thingiWishallnsobjectshad)
@属性(非原子,复制)NSString*foo;
@结束
#进口
@实现NSObject(SuperUsefulThingIWishAllNSObjectsHad)
静态常量void*MyPropertyKey=&MyPropertyKey;
@动态foo;
-(NSString*)foo
{
返回objc_getAssociatedObject(self,
MyPropertyKey);
}
-(void)setFoo:(NSString*)foo
{
objc_setAssociatedObject(自,
MyPropertyKey,
福,
OBJC_协会(复印件);
}
这更多是为了我自己的启发,但如果解决方案不是太老套,我可能有一些地方真的想使用它。您不需要在
dealloc
中做任何特殊的操作来“清理”关联对象。运行时会为您处理它。这与弧无关
如果不使用ARC,则需要确保在自己的dealloc
覆盖中调用[super dealloc]
。但是,不管您使用的是什么关联对象,都需要这样做,如果您忘记了,编译器会警告您
更新
回应您的评论:您是对的,Objective-C运行时引用没有明确指出在释放主对象时释放关联对象(如果根据关联策略适当)。但这是唯一合理的操作,因为关联对象的目的是将从属对象附加到主对象,而不更改主对象的源代码
无论如何,Objective-C运行时的源代码是开源的,因此我们可以检查它以验证这确实是实现的
查看,您将看到-[NSObject dealloc]
调用\u objc\u rootDealloc
,它调用对象\u dispose
object\u dispose
函数在中,它调用objc\u destructionInstance
,后者调用\u object\u remove\u assocations
\u object\u remove\u assocations
函数(是的,它在源代码中有一个输入错误)在中。它删除与正在解除分配的对象关联的所有对象,并在适当时释放它们。如果你看一下objc\u removeAssociatedReferences
,它是公共API的一部分,在中定义,你会看到它也调用\u object\u remove\u associated,所以基本上无论我是否在ARC中,objc\u set/getassociated object都知道如何自动清理自己?是否有相关的文件?没有什么东西冲着我跳。