2017-02-26 4 views
0

私は最近、NSMapTabledoc,nshipster)を発見しました。関連オブジェクトの代わりに使用できるかどうか疑問に思っていました。Objective-C関連オブジェクト対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) 
     } 
    } 
} 

私がいなくてもそうであるように、私は、運との違いをGoogleと理解しようとしました私は2つの実装をどのように比較できるかを知っています。

どうすれば比較できますか?違いは何ですか?

おかげ

+0

bbumの答えは、これらの2つの違いの1つの例ですが、ニーズに応じた回答を得るためには、ユースケースの具体例を挙げる必要があります。最初の場所? –

+0

何も具体的なことは何もなく、私は技術的な違いと2つのアプローチを比較する方法を理解しようとしていました。 –

答えて

2

オブジェクトが割り当て解除されると、OBJC_ASSOCIATION_RETAINを使用して関連付けられているすべてのオブジェクトが解放される(そして時にはそれが最後に強い参照した場合割り​​当て解除)。

NSMapTable例はdeallocでクリーンアップされません。


それ以外は機能的には同じですが、実装の詳細は異なります。最も重要なのはスレッドポリシーです。 NSMapTableはスレッドセーフではありませんが、OBJC_ASSOCIATION_RETAIN@property(atomic, strong)と同じ扱いです。

関連する問題