【发布时间】:2010-11-13 05:40:03
【问题描述】:
我在为我自己的 NSView 子类实现绑定方面有所突破。它可以工作,但是从 nib 文件绑定到文件所有者时,保留周期会出现问题。稍微阅读后,我发现苹果几年前也遇到过同样的问题,但已经用一些神奇的无证类(NSAutounbinder)修复了它。
http://www.cocoabuilder.com/archive/message/cocoa/2004/6/12/109600 这里对保留周期问题进行了长时间的讨论。解决方法是在窗口控制器释放之前解除所有绑定,而不是在它解除分配之前,在 windowWillClose: 之类的地方。这对我来说似乎是一个不必要的黑客攻击。
我的问题是:有没有办法让自定义绑定与 Apple 制作的绑定一样有效,而无需使用未记录的功能?我是不是走错了路?
更新 2:我找到了一个解决方案,它允许手动实现的绑定与 Apple 的绑定完全相同。它利用了未记录的 NSAutounbinder 类,而没有实际使用未记录的功能。我将在今天晚些时候发布解决方案。
更新:我尝试过使用exposeBinding:,但似乎没有任何区别。但是,bind:toObject:withKeyPath:options: 的 NSObject 实现一半有效。它传播从绑定者到绑定者的更改(即从模型/控制器到视图),但不能以相反的方式工作。此外,虽然明显观察到了绑定者,但从未触发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 对象的非保留代理。为避免retain cycle问题,是non-retaining。
当调用-[NSWindowController release] 并且retainCount == 1 时,NSAutounbinder 将所有绑定解除绑定到自身。这样可以确保在对象被释放之前没有悬空指针。
【问题讨论】:
-
当 CocoaBuilder 关闭时,您可以在 lists.apple.com/archives/cocoa-dev/2004//Jun/msg00835.html 找到相关线程
标签: objective-c cocoa cocoa-bindings