¿Se puede implementar manualmente los enlaces de cacao?

He tenido un error al implementar enlaces para mi propia subclase NSView. Funciona, pero hay problemas con los ciclos de retención al enlazar con el propietario del archivo desde un archivo de plumilla. Después de leerlo un poco, descubrí que Apple tenía el mismo problema hace unos años, pero lo solucioné con una clase de indocumentados mágicos (NSAutounbinder).

Hay una larga discusión del problema del ciclo de retención aquíhttp://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600 . La solución es deshacer todos los enlaces antes de que el controlador de la ventana sepublicado, no antes de que seadesasignado, en un lugar como windowWillClose :. Esto me parece un hack innecesario.

Mi pregunta es la siguiente: ¿hay alguna forma de hacer enlaces personalizados que funcionen tan bien como los de Apple, sin usar funciones no documentadas? ¿Voy por esto de la manera incorrecta?

ACTUALIZACIÓN 2: He encontrado una solución que permite que los enlaces implementados manualmente funcionen exactamente como los enlaces de Apple. Aprovecha la clase de NSAutounbinder no documentada, sin utilizar realmente características no documentadas. Voy a publicar la solución más tarde hoy.

ACTUALIZAR:He intentado usarexposeBinding:, y no parece hacer ninguna diferencia. sin embargo, elNSObject implementación debind:toObject:withKeyPath:options: la mitad trabaja Propaga cambios de bindee a carpeta (es decir, desde el modelo / controlador a la vista), pero no funciona de la manera opuesta. Además, aunque obviamente se observa el bindee,observeValueForKeyPath:ofObject:change:context: nunca se dispara

Ejemplo de proyecto aquí:http://www.tomdalling.com/wp-content/BindingsTest.zip

La documentación de Apple indica que, de hecho, tiene que anularbind:toObject:withKeyPath:options: Implementar fijaciones manuales. Mira aquí:http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html

NOTA LATERAL: He investigado cómo funciona el NSAutounbinder no documentado, y esto es lo que sé.

Cuando se crea un enlace a un NSWindowController, el objeto enlazado es en realidad un NSAutounbinder que se adquiere de NSWindowController con - [NSWindowController _autounbinder]. NSAutounbinder es un proxy no retenedor para el objeto NSWindowController. No se retiene para evitar el problema del ciclo de retención.

Cuando - [NSWindowController release] se llama y retieneCount == 1, NSAutounbinder desata todos los enlaces a sí mismo. Esto garantiza que no haya punteros colgantes al objeto antes de que se desasigne.

Respuestas a la pregunta(4)

Su respuesta a la pregunta