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()
}
コメントする