Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 如何释放在运行时添加到类别中的属性?_Objective C_Cocoa - Fatal编程技术网

Objective c 如何释放在运行时添加到类别中的属性?

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

根据以下类别定义,我可以如何处理-dealloc(带弧和不带弧)?我目前正在使用ARC,据我所知,我在仪器中四处走动,这些属性正在清理,但我对此没有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);
}
@接口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都知道如何自动清理自己?是否有相关的文件?没有什么东西冲着我跳。