Можете ли вы реализовать привязки Какао вручную?

У меня была проблема с реализацией привязок для моего собственного подкласса NSView. Это работает, но существуют проблемы с циклами сохранения при связывании с владельцем файла из файла пера. Немного почитав, я обнаружил, что у Apple была такая же проблема несколько лет назад, но я исправил ее с помощью некоторого волшебного недокументированного класса (NSAutounbinder).

Здесь долго обсуждается проблема сохранения циклаhttp://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600 , Обходной путь должен развязать все привязки, прежде чем оконный контроллерreleasedне раньше, чем этоdeallocated, в таком месте, как windowWillClose :. Это кажется ненужным хаком для меня.

У меня такой вопрос: есть ли способ сделать пользовательские привязки, которые работают так же, как и Apple, без использования недокументированных функций? Я поступаю об этом неправильно?

ОБНОВЛЕНИЕ 2: Я нашел решение, которое позволяет привязкам, реализованным вручную, работать точно так же, как привязки Apple. Он использует недокументированный класс NSAutounbinder, фактически не используя недокументированные функции. Я опубликую решение позже сегодня.

ОБНОВИТЬ:I've tried using exposeBinding:, and it doesn't seem to make any difference, Тем не менее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, связанный объект фактически является NSAutounbinder, который получен из NSWindowController с - [NSWindowController _autounbinder]. NSAutounbinder - это не сохраняющий прокси-объект для объекта NSWindowController. Это не удерживает, чтобы избежать проблемы сохранения цикла.

Когда - [NSWindowController release] вызывается и retainCount == 1, NSAutounbinder связывает все привязки с собой. Это гарантирует отсутствие висячих указателей на объект до его освобождения.

Ответы на вопрос(4)

Ваш ответ на вопрос