我已经在为我自己的 NSView 子类实现绑定方面有所突破。它可以工作,但是从 nib 文件绑定到文件所有者时,保留周期会出现问题。在读了一点之后,我发现苹果几年前也有同样的问题,但是用一些神奇的无证类(NSAutounbinder)修复了它。
这里有一个关于保留周期问题的冗长讨论http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600。解决方法是在窗口控制器释放之前解除所有绑定,而不是在释放之前,在 windowWillClose: 之类的地方。这对我来说似乎是不必要的黑客攻击。
我的问题是:有什么方法可以使自定义绑定与 Apple 制作的绑定一样有效,而无需使用未记录的功能?我会以错误的方式解决这个问题吗?
更新 2:我找到了一个解决方案,它允许手动实现的绑定完全像 Apple 的绑定一样工作。它利用了未记录的 NSAutounbinder 类,而没有实际使用未记录的功能。我将在今天晚些时候发布解决方案。
更新:我试过使用exposeBinding:
,它似乎没有任何区别。但是,NSObject
执行bind:toObject:withKeyPath:options:
一半有效。它传播从绑定者到绑定者的更改(即从模型/控制器到视图),但不能以相反的方式工作。此外,虽然 bindee 显然正在被观察,但从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 _autounbinder] 从 NSWindowController 获取。NSAutounbinder 是 NSWindowController 对象的非保留代理。避免保留循环问题是非保留的。
当 -[NSWindowController release] 被调用并且 retainCount == 1 时,NSAutounbinder 将所有绑定解除绑定到自身。这确保了在对象被释放之前没有悬空指针。