簡體   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