Mam crack na implementacji powiązań dla mojej własnej podklasy NSView. Działa, ale występują problemy z zachowaniem cykli podczas wiązania z właścicielem pliku z pliku nib. Po krótkim lekturze odkryłem, że Apple miał ten sam problem kilka lat temu, ale naprawił go za pomocą magicznej nieudokumentowanej klasy (NSAutounbinder).Czy można ręcznie zaimplementować wiązania kakao?
Jest długa dyskusja o problemie zachować cyklu tutaj http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600. Rozwiązaniem jest, aby rozwiązać wszystkie powiązania zanim kontroler okno jest wydany, zanim nie jest dealokowane, w takim miejscu windowWillClose :. To wydaje się niepotrzebnym hackem do mnie.
Moje pytanie brzmi: czy istnieje sposób na tworzenie niestandardowych wiązań, które działają tak samo, jak te wykonane przez Apple, bez korzystania z nieudokumentowanych funkcji? Czy podchodzę do tego w niewłaściwy sposób?
UPDATE 2: Znalazłem rozwiązanie, które pozwala ręcznie realizowane dokładnie jak Wiązania Wiązania Apple'a działa. Korzysta z nieudokumentowanej klasy NSAutounbinder, bez korzystania z nieudokumentowanych funkcji. Wczoraj opublikuję rozwiązanie.
UPDATE: Próbowałem za pomocą exposeBinding:
, i nie wydaje się żadnej różnicy. Jednak implementacja NSObject
z pół działa. Propaguje zmiany od binda do segregatora (tj. Od modelu/kontrolera do widoku), ale nie działa w odwrotny sposób. Ponadto, chociaż oczywiście jest obserwowany obiekt wiążący, nigdy nie jest uruchamiany observeValueForKeyPath:ofObject:change:context:
.
Przykład projekt tutaj: http://www.tomdalling.com/wp-content/BindingsTest.zip
dokumentacji Apple oznacza, że nie w rzeczywistości, trzeba zastąpić bind:toObject:withKeyPath:options:
wdrożyć ręcznych powiązań. Zobacz tutaj: http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
marginesie: mam badane jak nieudokumentowane NSAutounbinder działa, i oto, co wiem.
Po utworzeniu powiązania z NSWindowController, obiekt związany jest w rzeczywistości NSAutounbinder, który jest pozyskiwany z NSWindowController za pomocą - [NSWindowController _autounbinder]. NSAutounbinder jest nieprzebywalnym proxy dla obiektu NSWindowController. Nie zachowuje się, aby uniknąć problemu z cyklem utrzymania.
Kiedy - [NSWindowController release] zostaje wywołane i retainCount == 1, Nounutounbinder odwiązuje wszystkie wiązania do siebie. Zapewnia to, że przed zwolnieniem nie ma wiszących wskaźników do obiektu.
Podczas gdy CocoaBuilder jest wyłączony, możesz znaleźć odpowiedni wątek na stronie http://lists.apple.com/archives/cocoa-dev/2004//Jun/msg00835.html – s4y