Você pode implementar manualmente as ligações do Cocoa?

Eu tive uma chance de implementar ligações para a minha própria subclasse NSView. Ele funciona, mas há problemas com os ciclos de retenção ao vincular ao proprietário do arquivo a partir de um arquivo de ponta. Depois de ler um pouco sobre isso, descobri que a Apple tinha o mesmo problema há alguns anos, mas o consertei com alguma classe mágica não documentada (NSAutounbinder).

Há uma longa discussão sobre o problema do ciclo de retenção aquihttp://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600 . A solução é desvincular todas as ligações antes que o controlador de janela sejaliberado, não antes de serdesalocada, em um lugar como windowWillClose :. Isso parece ser um truque desnecessário para mim.

Minha pergunta é a seguinte: existe alguma maneira de fazer ligações personalizadas que funcionem tão bem quanto as feitas pela Apple, sem usar recursos não documentados? Eu estou indo sobre isso da maneira errada?

ATUALIZAÇÃO 2: Eu encontrei uma solução que permite que as ligações implementadas manualmente funcionem exatamente como as ligações da Apple. Ele tira proveito da classe NSAutounbinder não documentada, sem usar recursos não documentados. Vou postar a solução mais tarde hoje.

ATUALIZAR:Eu tentei usarexposeBinding:e não parece fazer nenhuma diferença. No entanto, oNSObject implementação debind:toObject:withKeyPath:options: metade funciona. Ele propaga as alterações de bindee para binder (ou seja, de modelo / controlador para exibição), mas não funciona de maneira oposta. Além disso, embora a bindee esteja obviamente sendo observada,observeValueForKeyPath:ofObject:change:context: nunca é acionado.

Exemplo de projeto aqui:http://www.tomdalling.com/wp-content/BindingsTest.zip

Documentação da Apple indica que você, de fato, tem que substituirbind:toObject:withKeyPath:options: para implementar ligações manuais. Veja aqui:http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html

NOTA LATERAL: Eu investiguei como o NSAutounbinder não documentado funciona, e aqui está o que eu sei.

Quando uma ligação é criada para um NSWindowController, o objeto vinculado é na verdade um NSAutounbinder que é adquirido do NSWindowController com - [NSWindowController _autounbinder]. O NSAutounbinder é um proxy não retentor do objeto NSWindowController. É não reter para evitar o problema do ciclo de retenção.

Quando - [NSWindowController release] é chamado e retainCount == 1, o NSAutounbinder desassocia todas as ligações para si mesmo. Isso garante que não haja ponteiros pendentes no objeto antes de ser desalocado.

questionAnswers(4)

yourAnswerToTheQuestion