Iphone 将AppDelegate用作您的Singleton是一种不好的做法吗?

Iphone 将AppDelegate用作您的Singleton是一种不好的做法吗?,iphone,objective-c,cocoa-touch,Iphone,Objective C,Cocoa Touch,我有时在我的项目中使用单例(存储多个不同类使用的数据),我在想为什么不使用我的AppDeltage,因为它已经是单例且易于访问。这是一种不好的做法吗?如果是,为什么 AppDelegate应该在启动、后台输入等状态下处理应用程序行为。你不应该让它更复杂,因为它不是一个好的设计模式。但您始终可以在AppDelegate中保留对数据存储类的引用,并通过AppDelegate访问它。通过这种方式,您可以从AppDelegate中提取存储的数据,但仍然可以轻松地访问它 就数据抽象而言,它可能有点不安全,

我有时在我的项目中使用单例(存储多个不同类使用的数据),我在想为什么不使用我的AppDeltage,因为它已经是单例且易于访问。这是一种不好的做法吗?如果是,为什么

AppDelegate应该在启动、后台输入等状态下处理应用程序行为。你不应该让它更复杂,因为它不是一个好的设计模式。但您始终可以在AppDelegate中保留对数据存储类的引用,并通过AppDelegate访问它。通过这种方式,您可以从AppDelegate中提取存储的数据,但仍然可以轻松地访问它

就数据抽象而言,它可能有点不安全,但我相信它在内存中也是一个方便的地方。您应该做的可能是用访问器方法封装变量,以便有地方执行与并发相关的操作(如果有的话)


但是,如果您的意思是将对象从一个UI类传递到另一个UI类,那么您可能应该使用其他方法,例如从另一个UI类设置一个UI类的成员变量,或者使用数据存储等。

对于与整个应用程序相关的少量控制器代码,我使用AppDelegate。如果有一种合理的方法将代码拆分为一个单独的控制器对象,那么这将是更好的选择,正如我所看到的应用程序委托已膨胀到无法管理的大小

它也可以是一种很好的“单音化”控制器对象的方法,如果您以后想拥有多个控制器对象,则无需过桥

实际上,我在AppDelegate上放置了一个类方法来访问它,因此我可以执行以下操作:

[[AppDelegate get].dataStore getRecordNumber:x] // or
[[AppDelegate get].server refreshData]
但我相信,在团队环境中,有人认为这是一个糟糕的设计。

这个问题没有正确的答案。你会对此有很多意见。我认为使用AppDelegate没有问题,我对我的所有应用都这么做:

  • 对于iPhone应用程序,代理实际上是强制性的
  • 它在应用程序的生命周期中一直存在
  • 你可以从程序中的任何地方访问它(尽管不要滥用它!)
但是,我们必须保持警惕,这样代码就不必存在,也就不存在了。您不希望您的AppDelegate变得庞大且无法维护

关于StackOverflow,之前已回答了以下问题:


关于这一点的答案也可能对你有所帮助。

我听到很多关于这一点的废话,但对于具有全球相关性的小数据,我完全可以将其保留在应用程序代理中

较大的数据块需要一个内存不足的存储(核心数据、文件系统、SQLlite等)


我的第一个应用程序中有大量数据(NSDictionary中的文本、各种大小的UIImage等)。我构建了一个数据管理单例,将所有数据保存在一个地方,并处理服务器的更新请求。效果不错。如果我当时知道我现在知道的,我可能会制定一个核心数据同步策略。

如何从其他类直接访问AppDelegate?例如,访问其中的属性或其他内容要获取对委托的类型化访问,请调用YourAppDelegate*delegate=(YourAppDelegate*)[UIApplication sharedApplication].delegate;那么,可以在各种ViewController中导入Appdelegate吗?如果不是的话,请告诉我一个地方来解释它,这真的取决于-我正在编写一个游戏应用程序,我需要一个单例类来管理分数,玩家等。。。在这种情况下,Singleton比核心数据工作得更好。我正在写另一个应用程序,它可以在线存储数据和下载内容。在这种情况下,我使用的是核心数据。是的,这也很好。我也因为没有坚定地反对单身而被嘲笑。我认为这是一个很好的工具,就像很多很好的工具一样,有可能被误用。