2017-02-26 20 views
0

我最近發現NSMapTabledoc,nshipster),我一直在想它是否可以用來代替關聯的對象。Objective-C相關對象vs NSMapTable

下面是一個例子使用標準相關聯的對象:使用NSMapTable

var fooKey = "foo" 
extension UIView { 

    var foo: UIImage? { 
    set { 
     objc_setAssociatedObject(self, &fooKey, newValue, .OBJC_ASSOCIATION_RETAIN) 
    } 
    get { 
     return objc_getAssociatedObject(self, &fooKey) as? UIImage 
    } 
    } 
} 

與實現:

let barTable = NSMapTable<UIView, UIImage>(keyOptions: [.weakMemory], valueOptions: [.strongMemory]) 

extension UIView { 

    var bar: UIImage? { 
     get { 
     return barTable.object(forKey: self) 
     } 
     set { 
     barTable.setObject(newValue, forKey: self) 
     } 
    } 
} 

我想谷歌和理解,沒有運氣的差異,我甚至不知道我可以如何比較兩個實現。

我該如何比較它們?有什麼區別?

由於

+0

bbum的答案給出了這兩者之間差異的一個例子,但要得到一個特定於您的需求的答案,您將不得不提供一些更具體的用例示例 - 爲什麼需要關聯的對象第一個地方? –

+0

現在沒有具體的東西,我只是想了解技術差異以及如何比較這兩種方法。 –

回答

2

當物體被釋放時,與它使用OBJC_ASSOCIATION_RETAIN將被釋放相關的所有對象(有時解除分配,如果這是最後的強參考)。

您的NSMapTable示例將不會清理dealloc


除此之外,他們在功能上是相同的,但有不同的實現細節。最重要的是線程策略; NSMapTable不是線程安全的,而OBJC_ASSOCIATION_RETAIN被視爲與@property(atomic, strong)相同。