将 AppDelegate 用作 Singleton 是一种不好的做法吗?
Posted
技术标签:
【中文标题】将 AppDelegate 用作 Singleton 是一种不好的做法吗?【英文标题】:Is it a bad practice to use your AppDelegate as your Singleton? 【发布时间】:2011-07-15 14:09:24 【问题描述】:我有时会在我的项目中使用单例(存储多个不同类使用的数据),我在想为什么不使用我的 AppDeletage,因为它已经是单例并且易于访问。这是一个不好的做法,如果是,为什么?
【问题讨论】:
【参考方案1】:没有正确的答案。你会得到很多关于这个的意见。我认为使用 AppDelegate 没有任何问题,我对所有应用都这样做:
对于 iPhone 应用,委托实际上是强制性的, 它在应用程序的整个生命周期内都存在; 并且可以从程序中的任何位置访问它(尽管不要滥用它!)。尽管如此,我们必须保持警惕,以便那些不一定存在的代码不存在。您不希望您的 AppDelegate 变得庞大且无法维护。
这个问题之前已经在 *** 上回答过:
Application Design and AppDelegate
这方面的答案也可能对您有所帮助。
【讨论】:
如何从其他类直接访问 AppDelegate?例如,访问其中的属性或其他东西 要获得对您的委托的键入访问权限,请调用 YourAppDelegate *delegate = (YourAppDelegate *)[UIApplication sharedApplication].delegate; 那么可以在各种viewcontrollers中导入Appdelegate吗?如果没有,请指点我解释它的地方【参考方案2】:AppDelegate 应该处理应用程序在启动、后台进入等状态下的行为。你不应该让它更复杂,因为它不是一个好的设计模式。但是您始终可以在 AppDelegate 中保留对 dataStore 类的引用,并通过 AppDelegate 访问它。通过这种方式,您可以从 AppDelegate 中抽象数据存储,但您仍然可以轻松访问它。
【讨论】:
【参考方案3】:我对此有很多吹嘘,但对于具有全球相关性的小数据,我完全没有问题保留在 App Delegate 中。
更大的数据需要一个内存不足的存储(Core Data、文件系统、SQLlite 或你有什么)。
我的第一个应用程序有大量数据(NSDictionaries 中的文本、各种大小的 UIImages 等)。我构建了一个数据管理单例,将其全部保存在一个地方并处理服务器更新请求。它工作好的。如果我当时知道我现在所知道的,我可能会制定一个 Core Data 同步策略。
【讨论】:
这真的取决于 - 我正在编写一个游戏应用程序,我需要一个单例类来管理分数、玩家等......在这种情况下,单例比 Core Data 更好。我正在编写另一个应用程序,它实际上存储数据并在线下载内容。在这种情况下,我使用的是 Core Data。 是的,这也很好。我也因为没有坚定地反对单身而感到很生气。我认为这是一个很好的工具,就像许多优秀的工具一样,有可能被滥用。【参考方案4】:嗯,就数据抽象而言,它可能有点不安全,但我相信它在内存中也是一个方便的地方。你应该做的,可能是用访问器方法封装变量,这样你就有地方做并发相关的操作(如果有的话)
但是,如果您的意思是将对象从一个 UI 类传递到另一个,那么您可能应该使用其他东西,例如设置另一个的成员变量,或者使用数据存储等。
【讨论】:
【参考方案5】:对于与整个应用程序相关的少量控制器代码,我使用 AppDelegate。如果有一种明智的方法可以将代码拆分成一个单独的控制器对象,那么这将是更可取的,因为我已经看到应用程序委托已经膨胀到无法管理的大小。
这也是一种“单例化”控制器对象的好方法,如果您以后想拥有多个控制器对象,则不会烧毁您的桥梁。
我实际上在 AppDelegate 上放了一个类方法来访问它,所以我可以执行以下操作:
[[AppDelegate get].dataStore getRecordNumber:x] // or
[[AppDelegate get].server refreshData]
但我敢肯定,有些人认为这是团队设置中的糟糕设计。
【讨论】:
以上是关于将 AppDelegate 用作 Singleton 是一种不好的做法吗?的主要内容,如果未能解决你的问题,请参考以下文章
csharp C# - 简单的SerialPort单例类|示例:https://heiswayi.github.io/2016/csharp-simple-serialport-singleton-c
将 AppDelegate.h 和 AppDelegate.m 替换为 AppDelegate.swift
iOS:将两个 NSMutableArray 存储在 .plist 文件中
将数据从 ViewController 传递到 AppDelegate