Cocoa 中的共享对象
Posted
技术标签:
【中文标题】Cocoa 中的共享对象【英文标题】:Shared Objects in Cocoa 【发布时间】:2009-01-27 21:04:20 【问题描述】:我正在使用 Cocoa 中的 CoreData(不是基于文档的)。 我的问题是,我想从不同的 NIB 访问 SAME NSArrayController。 但是每个 NIB 都有一个自己的 NSArrayController 实例。
我现在的问题是如何生成 sharedObjects(如 NSUserDefaultsController)。 这对我有很大帮助。感谢您的回答。 =)
【问题讨论】:
【参考方案1】:您通常不希望在 nib 之间共享 NSArrayController。拥有多个 NSArrayController(每个 NIB 一个)可能会更好,它们都绑定到同一个底层模型。如果您希望此模型(例如 NSArray)是应用程序全局的,您可以通过 NSApplication 的委托公开它(例如,在 MainMenu.nib 中实例化您的自定义 MyAppDelegate 类并将 NSApplication 的 delegate
出口连接到您的 MyAppDelegate 类的实例) .在其他 NIB 中,您可以将 NSArrayController 的 contentArray
绑定绑定到 Shared Application.delegate.myArray
(假设 MyAppDelegate 通过符合 KVC 的方法公开了一个名为 myArray
的 NSArray 绑定)。您实际上是在使用 IB 和 MainMenu.nib 来创建 MyAppDelegate 的单例实例。
请记住,这种方法会使您的应用程序的单元测试变得困难,因为现在对象图中的单例是您无法在测试期间模拟或存根的。为每个辅助(非 MainMenu.nib)NIB 创建一个 NSWindowController 或 NSViewController 并将这些 nib 中的 NSArrayControllers 绑定到File Owner.myArray
会更好。然后,您可以实例化 NSWindowController 或 NSViewController,在加载辅助 NIB 之前向其传递一个数组(或数组 KVC 兼容对象)。通过这种方式,您可以单独测试 nib 的功能(对数组使用模拟或存根)。
【讨论】:
这比数百页愚蠢的 Apple 文档更清晰地描绘了应用程序的流程。【参考方案2】:我不确定重用 NSArrayController 是不是最好的选择(我需要更多地了解你的项目,但我从来没有遇到过我会这样做的情况),但是你可以在类方法中使用静态变量,如下所示:
+ (id)sharedObject;
static id object = nil;
if ( object == nil )
object = [[self alloc] init];
return object;
请记住,这不是真正的单例,因为您仍然可以分配该类的其他对象。如果你真的想要严格,可以使用this guide。
【讨论】:
【参考方案3】:Matt Gallagher 在他的博客上有一个good post on singletons and other ways to have "global" data,您可能也想查看一下。它比 Apple 的文档更清晰一些,并且有一个指向头文件的链接,可以轻松轻松地从几乎任何 Cocoa 类中创建单例。
我实际上在我的一些项目中使用了他的头文件,效果很好。
【讨论】:
以上是关于Cocoa 中的共享对象的主要内容,如果未能解决你的问题,请参考以下文章
Cocoa Inspector - 如何在关闭最后一个文档后重置窗口标题