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 应用程序共享数据

在 xcode/objective-c 中的项目之间共享类

Cocoa Inspector - 如何在关闭最后一个文档后重置窗口标题

如何更改共享脚本中的变量,而不影响共享该脚本的所有其他游戏对象?

在 Delphi 中的多个应用程序之间共享一个对象

在 C# 中的类之间共享对象