这里有一个关于保留周期问题的详细讨论 http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600。解决方法是在窗口控制器被“释放”之前而不是在其“dealloc”之前取消所有绑定,比如在windowWillClose:中。对我来说,这似乎是一个不必要的hack。
我的问题是:是否有任何方法可以制作与苹果制作的一样好的自定义绑定,而不使用未记录的功能?我是不是走错了路?
更新2:我找到了一个解决方案,可以让手动实现的绑定与苹果的绑定完全相同。它利用了未公开的NSAutounbinder类,而不实际使用未公开的功能。我稍后会发布解决方案。
更新:我已尝试使用“exposeBinding:”,但似乎没有任何区别。然而,“bind:toObject:withKeyPath:options:”的NSObject实现半工作。它将变化从bindee传播到binder(即从模型/控制器到视图),但不起作用相反的方式。此外,虽然bindee显然正在被观察,但“observeValueForKeyPath:ofObject:change:context:”从未触发。
示例项目在这里:http://www.tomdalling.com/wp-content/BindingsTest.zip 苹果的文档表明,事实上,您必须覆盖“bind:toObject:withKeyPath:options:”才能实现手动绑定。请参见这里:http://developer.apple.com/documentation/Cocoa/Conceptual/CocoaBindings/Concepts/HowDoBindingsWork.html
顺便提一下:我调查了未经记录的NSAutounbinder的工作原理,以下是我所知道的。
当创建一个绑定到NSWindowController时,绑定的对象实际上是从NSWindowController获取的NSAutounbinder,使用-[NSWindowController _autounbinder]。 NSAutounbinder是NSWindowController对象的非保留代理。它是非保留的,以避免保留循环问题。
当调用-[NSWindowController release]并且retainCount == 1时,NSAutounbinder取消所有绑定到自身的绑定。这确保在对象被释放之前没有悬空指针。