J'ai eu une fissure à la mise en œuvre de liaisons pour mon propre NSView sous-classe. Il fonctionne, mais il y a des problèmes avec les conserver cycles lors de la liaison à Propriétaire du Fichier à partir d'un fichier nib. Après avoir lu dans un peu, j'ai découvert qu'Apple avait le même problème quelques années en arrière, mais ont fixé avec de la magie sans-papiers de la classe (NSAutounbinder).
Il y a une longue discussion de la conserver cycle de problème ici http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600 . La solution de contournement consiste à séparer toutes les liaisons avant de la fenêtre contrôleur est sorti, pas avant qu'il soit libéré, dans un endroit comme windowWillClose:. Cela me semble inutile de faire des hack pour moi.
Ma question est la suivante: Est-il possible de faire des liaisons personnalisées qui fonctionnent ainsi que celles faites par Apple, sans l'aide de fonctionnalités non documentées? Je suis aller sur ce de la mauvaise façon?
Mise à JOUR 2: j'ai trouvé une solution qui permet de manuellement la mise en œuvre des liaisons de travailler exactement comme Apple liaisons. Il prend le parti des sans-papiers NSAutounbinder classe, sans utilisation de fonctions non documentées. Je vais poster la solution plus tard aujourd'hui.
Mise à JOUR: j'ai essayé à l'aide d' exposeBinding:
, et il ne semble pas faire de différence. Cependant, l' NSObject
de la mise en œuvre de l' bind:toObject:withKeyPath:options:
de la moitié des œuvres. Elle se propage changements de bindee de liant (c'est à dire à partir du modèle/contrôleur de vue), mais ne fonctionne pas de la manière opposée. Aussi, bien que le bindee est évidemment d'être observé, observeValueForKeyPath:ofObject:change:context:
n'est jamais déclenché.
Exemple de projet ici: http://www.tomdalling.com/wp-content/BindingsTest.zip
La documentation d'Apple indique que vous n'avez, en fait, ont pour remplacer bind:toObject:withKeyPath:options:
pour mettre en œuvre le manuel de liaisons. Voir ici: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
NOTE de CÔTÉ: j'ai étudié la façon dont les sans-papiers NSAutounbinder œuvres, et voici ce que je sais.
Lors de la création d'une liaison à un NSWindowController, l'objet lié est en fait un NSAutounbinder qui est acquis à partir de la NSWindowController avec -[NSWindowController _autounbinder]. NSAutounbinder est un non-conservation de proxy pour le NSWindowController objet. Il est non-retenue pour éviter de le conserver cycle de problème.
Quand -[NSWindowController de presse] est appelé et retainCount == 1, La NSAutounbinder délie toutes les liaisons à lui-même. Cela garantit qu'il n'existe pas en balançant des pointeurs de l'objet avant qu'il soit libéré.