Можете ли вы реализовать привязки Какао вручную?
У меня была проблема с реализацией привязок для моего собственного подкласса 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 связывает все привязки с собой. Это гарантирует отсутствие висячих указателей на объект до его освобождения.