gpt4 book ai didi

objective-c - objc_setAssociatedObject with nil 要删除 - 是否检查了策略?

转载 作者:搜寻专家 更新时间:2023-10-30 20:05:46 25 4
gpt4 key购买 nike

在文档中...

objc_setAssociatedObject

Sets an associated value for a given object using a given key and association policy.

void objc_setAssociatedObject(id object, void *key, id value, objc_AssociationPolicy policy)

Parameters object The source object for the association.

key The key for the association.

value The value to associate with the key key for object. Pass nil to clear an existing association.

policy The policy for the association. For possible values, see “Associative Object Behaviors.”

不清楚的是,当您调用 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 的先前或 future 值)。因此,当您关联 value 时给出的策略就是当您取消关联 value 时使用的策略。

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

关于objective-c - objc_setAssociatedObject with nil 要删除 - 是否检查了策略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19920591/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com