繁体   English   中英

删除nil的objc_setAssociatedObject - 是否已进行策略检查?

[英]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_setAssociatedObjectpolicy参数指定运行时应如何处理同一函数调用的value参数,而不是它应如何处理任何其他对象(例如同一key的先前或未来值)。 因此,关联value时给出的策略是取消关联value时使用的策略。

您可以验证实现是否以这种方式运行,因为Objective-C运行时的源代码是开源的。 您可以在objc-references.mm找到处理关联引用的代码。 感兴趣的函数是_object_set_associative_reference ,它调用ReleaseValue ,它调用releaseValue

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM