2016年8月アーカイブ

weak var delegate: DelegateProtocol?


これはよく見られる1つだけ登録可能なdelegateプロパティです。

対象のライフサイクルに干渉しない様、weak属性となっています。


複数登録可能なdelegateプロパティを実装する際、Array型を使うと上記と同じ仕様になりません。

Array型に要素を追加することにより、retain countが増加してしまい強参照となってしまう為です。


弱参照でありつつ複数登録可能なArray(Set)を作るには、NSHashTableを用います。


var delegateTable = NSHashTable.weakObjectsHashTable()


delegateTableに追加した要素は弱参照で登録され、参照先が解放された際自動的に要素は削除されます。


要素の追加は次の通りです。


delegateTable.addObject(ObjA())


NSHashTable内の要素はAnyObject型で管理される為、Array型と違いあらかじめ要素の型を指定することはできません。

登録されている各要素のdelegateメソッドを正しく実行する為には、次の手順を実行します。


for case let target as DelegateProtocol in self.delegateTable.allObjects {

target.sampleFunc()

}