[英]objc_setAssociatedObject with nil to remove - is policy checked?
在文档中......
objc_setAssociatedObject
使用给定的键和关联策略为给定对象设置关联值。
void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)
参数 object关联的源对象。
key关联的关键。
value与对象的键键关联的值。 通过nil清除现有关联。
政策协会的政策。 有关可能的值,请参阅“关联对象行为”。
不清楚的是,当您调用objc_setAssociatedObject()
来删除关联时,是否有必要使用与最初设置属性相同的策略? 或者objc_setAssociatedObject()
只是使用适当的策略来“撤消”前一组? 我假设它必须忽略该策略,否则如果您只是设置另一个值,则需要使用相同的策略设置之前的值。 不同的是,在某些情况下,将调整当前存储的属性的引用计数,在其他情况下,它将不会。
很明显,系统会在内部跟踪它,否则泛型objc_removeAssociatedObjects()
可能永远不会工作,ARC无论如何都需要知道它甚至可以工作。
我需要亲自了解的原因是以下代码片段:
typedef const void* associatedPropertyKeyToken;
和
-(NSMutableDictionary*) associatedInfo{
NSMutableDictionary *result = [self associatedPropertyForKey:NSAsssociatedInfo];
if (!result) {
[self retainAssociatedProperty:(result = [NSMutableDictionary dictionary])
forKey:NSAsssociatedInfo];
}
return result;
}
-(BOOL) associatedPropertyForKeyExists:(associatedPropertyKeyToken)aKey {
#if DEBUG_ASSOCIATED
BOOL result =
#else
return
#endif
objc_getAssociatedObject(self,aKey)!=nil;
#if DEBUG_ASSOCIATED
NSLog(@"getting associatedPropertyForKeyExists:%@ = %@",NSStringFromAssociatedPropertyKeyToken(aKey),
result ? @"YES" : @"NO");
return result;
#endif
}
-(void) assignAssociatedProperty:(id)prop forKey:(associatedPropertyKeyToken)aKey{
#if DEBUG_ASSOCIATED
NSLog(@"assigning associatedPropertyForKey:%@ <= %@",NSStringFromAssociatedPropertyKeyToken(aKey),
prop);
#endif
objc_setAssociatedObject(self,aKey, prop, OBJC_ASSOCIATION_ASSIGN);
}
-(void) retainAssociatedProperty:(id)prop forKey:(associatedPropertyKeyToken)aKey{
#if DEBUG_ASSOCIATED
NSLog(@"retaining associatedPropertyForKey:%@ <= %@",NSStringFromAssociatedPropertyKeyToken(aKey),
prop);
#endif
objc_setAssociatedObject(self, aKey, prop, OBJC_ASSOCIATION_RETAIN_NONATOMIC);
}
-(void) removeAssociatedPropertyForKey:(associatedPropertyKeyToken)aKey{
#if DEBUG_ASSOCIATED
NSLog(@"removing associatedPropertyForKey:%@",NSStringFromAssociatedPropertyKeyToken(aKey));
#endif
objc_setAssociatedObject(self,aKey, NULL, OBJC_ASSOCIATION_ASSIGN);
}
objc_setAssociatedObject
的policy
参数指定运行时应如何处理同一函数调用的value
参数,而不是它应如何处理任何其他对象(例如同一key
的先前或未来值)。 因此,关联value
时给出的策略是取消关联value
时使用的策略。
您可以验证实现是否以这种方式运行,因为Objective-C运行时的源代码是开源的。 您可以在objc-references.mm
找到处理关联引用的代码。 感兴趣的函数是_object_set_associative_reference
,它调用ReleaseValue
,它调用releaseValue
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.