自分のNSViewサブクラスのバインディングを実装するのに問題がありました。動作しますが、nibファイルからファイルの所有者にバインドするときの保持サイクルに問題があります。少し読んだ後、私はAppleが数年前に同じ問題を抱えていることを発見しましたが、いくつかの魔法の文書化されていないクラス(NSAutounbinder)でそれを修正しました。
ここhttp://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600で、保持サイクルの問題について長い議論があります。回避策は、windowWillClose:のような場所で、ウィンドウコントローラが解放される前に、割り当てが解除される前ではなく、すべてのバインディングのバインドを解除することです。これは私には不必要なハックのようです。
私の質問はこれです:文書化されていない機能を使用せずに、Appleによって作成されたものと同様に機能するカスタムバインディングを作成する方法はありますか?私はこれを間違った方法で行っていますか?
更新2:手動で実装されたバインディングがAppleのバインディングとまったく同じように機能することを可能にするソリューションを見つけました。文書化されていない機能を実際に使用することなく、文書化されていないNSAutounbinderクラスを利用します。解決策は本日遅くに投稿します。
更新:を使用してみましexposeBinding:
たが、違いはないようです。ただし、半分のNSObject
実装は機能します。bind:toObject:withKeyPath:options:
バインド先からバインダーへ(つまり、モデル/コントローラーからビューへ)変更を伝播しますが、逆の方法では機能しません。また、バインド先は明らかに監視されていますが、トリガーされるobserveValueForKeyPath:ofObject:change:context:
ことはありません。
ここにあるプロジェクトの例:http://www.tomdalling.com/wp-content/BindingsTest.zip
Appleのドキュメントによると、実際には、bind:toObject:withKeyPath:options:
手動バインディングを実装するにはオーバーライドする必要があります。ここを参照してください:http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
サイドノート:文書化されていないNSAutounbinderがどのように機能するかを調査しましたが、これが私が知っていることです。
NSWindowControllerへのバインディングが作成されると、バインドされたオブジェクトは実際には、-[NSWindowController_autounbinder]を使用してNSWindowControllerから取得されるNSAutounbinderです。NSAutounbinderは、NSWindowControllerオブジェクトの非保持プロキシです。保持サイクルの問題を回避することは非保持です。
-[NSWindowControllerrelease]が呼び出されてretainCount==1の場合、NSAutounbinderはすべてのバインディングをそれ自体にバインド解除します。これにより、割り当てが解除される前に、オブジェクトへのダングリングポインタがなくなります。