好的,在这个问题被投了赞成票之后,然后因为不知道为什么而被投到零,我继续调查我自己的答案。我认为让您的应用程序委托类成为真正的单例很有用,这样您就不会对 NIB 感到头疼。 我不明白为什么它会有害。 而且我认为,如果您的应用程序只有一个用户界面,那么让应用程序委托拥有所有 NIB 的核心数据堆栈并不是不合理的。但是,推荐的设计模式是让每个窗口或视图控制器传递 ManagedObjectContext 指针,并通过文件的所有者占位符而不是使用 App Delegate 对象来访问 MOC。
然而另一方面,“共享用户默认控制器”单例的情况有所不同,它在每个 NIB 中都有一个特殊的对象。我们不必向每个控制器传递一个指向它的指针,以便每个视图都可以访问它。它只是无所不在。应用程序委托是不同的。每个 NIB 中都没有“Shared App Delegate”对象。是的,有理由从不与 NIB 中的应用程序代表交谈,但这不是问题的答案。
所以,一个答案。
单例设计模式:
Apple 很久以前在此已弃用的参考文档中介绍过——创建单例实例。
原来我希望我的应用程序委托类实现的是“严格”实现,而不是有一个可以创建应用程序委托类的其他对象的工厂方法。这里的一个不同功能是[NSApp delegate]
主指针而不是应用程序委托类函数。
严格的实现必须为我的应用程序委托类覆盖 allocWithZone(因为 alloc 调用 allocWithZone)。
+ (MYAppDelegate*)allocWithZone:(NSZone *)zone
{
if ([NSApp delegate] == nil) return [super allocWithZone:zone];
return [NSApp delegate];
}
- (MYAppDelegate*)copyWithZone:(NSZone *)zone
{
return self;
}
Init 只是返回[super init]
就可以了,所以它不需要覆盖。
似乎工作。如果没有,我会更新这个。
[更新] 我也一直在研究使用NSBundle
's加载 NIB loadNibNamed:owner:topLevelObjects:
- 但似乎我会用新的应用程序委托对象返回一个数组,即使是从那个方法。该方法允许获取指向 NIB 中顶级对象的指针,而无需为它们创建其他出口。除了 MainMenu 之外,在 XIB 中获取应用程序委托对象的最佳方法似乎仍然是使用类似于上面的代码的方法。
[另一个更新]为什么它可能有害:根据本文档中的“OS X 中的顶级对象可能需要特殊处理”部分,我有充分的理由相信,即使使用 ARC,我的这个答案也会增加[NSApp 委托] 上的保留计数,但是如果我觉得可以在 dealloc 中为具有应用程序委托的顶级对象的窗口/视图控制器做一个桥接和释放应用程序委托。另外,这意味着应用程序委托类之外的代码。