如何为视图控制器提供指向已初始化的单例对象的指针?

时间:2014-08-17 22:59:29

标签: ios objective-c oop

通过-[AppDelegate didFinishLaunchingWithOptions?]初始化Singleton对象后,如何将此对象的指针传递给视图控制器?

它有所帮助,让我们假设该对象是独立的,但与UI合理地耦合在一起。 (例如,管理服务器连接线程。)所以我更喜欢更多的东西"亲密"而不是通过NSNotificationCenter发送信号。

2 个答案:

答案 0 :(得分:3)

取决于。

如果单个视图控制器需要该对象,请在viewDidLoad中初始化它。如果整个应用程序需要它,请在应用程序委托中初始化它。

在您的情况下,它可能最适合应用程序委托,因为它在应用程序的生命周期中是必需的,而不仅仅用于一个视图控制器。

您可以在应用委托中创建属性并将对象放入其中。您可以从应用程序的任何位置获取代理,如下所示:

((AppDelegate *)[UIApplication sharedApplication].delegate)

所以,只要您从正在访问app delegate的文件中有#imported AppDelegate.h,就可以得到如下对象:

MyObject *object = ((AppDelegate *)[UIApplication sharedApplication].delegate).propertyName;

答案 1 :(得分:2)

看起来你需要单身对象!?听起来像是,你不应该关心“在哪里初始化它”。您只需创建共享实例,它将在第一次调用后立即创建:

  

[[myObjectWhichLivesForever instance] doSomething]

如果您需要一些UI功能,则应将其设计为灵活... f.e如果您希望在myView MyUIViewController中显示进度条:

[[MyObjectWhichLivesForever instance] showProgressBarInView:myView]

甚至是类方法:

[MyObjectWhichLivesForever showProgressBarInView:myView]

我相信MBProgressHud和其他类似的事情都是这样的。

肯定:

  • 对象在整个应用程序中都可用,您不必从appDelegate传递指针(可能会很痛苦)

否定:

  • 在互联网上的大量信息根据为什么singleton不是最佳解决方案(但在开发中经常遇到,特别是对于iOS)