[英]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.