2

我只是在圈子里跑来跑去,所有这些都归结为在不是NSMainNibFile. 令人惊讶的是,拥有两个应用程序代表意味着您有单独的managedObjectContexts的 .

这里有一个想法——我可以让我的应用程序委托类成为单例吗?并在更多的 XIB 中安全地实例化它?那会破坏什么?

此外,在 stackoverflow 上有一些提到[[UIApplication sharedApplication] delegate]是“单例”,但似乎UIApplicationDelegate协议并不能保证这一点,超类也不是UIResponder单例。那么我是否也可以在 iOS 上在这方面自取其辱呢?

[编辑] 看起来你可以在UIApplicationMainiOS 中取消 delegateClassName 并让主 NIB 加载委托对象,因此如果使用主 NIB,你可以创建在 OSX 上看到的 App Delegate 对象模式。

[edit2] MainMenu.xib 对于新的非文档应用程序的外观截图。项目使用此对象创建,应用程序委托类使用窗口属性创建。问题是在其他 NIB 中获得那个方便的对象,并且该对象与[NSApp delegate] 在此处输入图像描述

4

3 回答 3

0

只需在您现有的 App Delegate 中执行此操作(只有一个!)

// In the header file    
+ (AppDelegate*) sharedInstance;


// In the body
+ (AppDelegate*) sharedInstance {

    return (AppDelegate*) [[UIApplication sharedApplication] delegate];

}

然后在任何你想引用你的 App Delegate 的地方,你可以简单地使用[AppDelegate sharedInstance]后面跟着你想调用的属性或实例方法。

于 2014-04-04T22:09:33.793 回答
0

好的,在这个问题被投了赞成票之后,然后因为不知道为什么而被投到零,我继续调查我自己的答案。我认为让您的应用程序委托类成为真正的单例很有用,这样您就不会对 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 中为具有应用程序委托的顶级对象的窗口/视图控制器做一个桥接和释放应用程序委托。另外,这意味着应用程序委托类之外的代码。

于 2014-04-04T21:44:29.460 回答
0

无论如何,您不应该使用应用程序委托来处理与核心数据有关的事情。所以让它成为一个强制的单例是没有意义的。

理想情况下,根本不需要引用它。

于 2014-04-04T22:59:24.053 回答