【发布时间】:2011-07-15 14:09:24
【问题描述】:
我有时会在我的项目中使用单例(存储多个不同类使用的数据),我在想为什么不使用我的 AppDeletage,因为它已经是单例并且易于访问。这是一个不好的做法,如果是,为什么?
【问题讨论】:
标签: iphone objective-c cocoa-touch
我有时会在我的项目中使用单例(存储多个不同类使用的数据),我在想为什么不使用我的 AppDeletage,因为它已经是单例并且易于访问。这是一个不好的做法,如果是,为什么?
【问题讨论】:
标签: iphone objective-c cocoa-touch
没有正确的答案。你会得到很多关于这个的意见。我认为使用 AppDelegate 没有任何问题,我对所有应用都这样做:
尽管如此,我们必须保持警惕,以便那些不一定存在的代码不存在。您不希望您的 AppDelegate 变得庞大且无法维护。
这个问题之前已经在 StackOverflow 上回答过:
Application Design and AppDelegate
这方面的答案也可能对您有所帮助。
【讨论】:
AppDelegate 应该处理应用程序在启动、后台进入等状态下的行为。你不应该让它更复杂,因为它不是一个好的设计模式。但是您始终可以在 AppDelegate 中保留对 dataStore 类的引用,并通过 AppDelegate 访问它。通过这种方式,您可以从 AppDelegate 中抽象数据存储,但您仍然可以轻松访问它。
【讨论】:
我对此有很多吹嘘,但对于具有全球相关性的小数据,我完全没有问题保留在 App Delegate 中。
更大的数据需要一个内存不足的存储(Core Data、文件系统、SQLlite 或你有什么)。
我的第一个应用程序有大量数据(NSDictionaries 中的文本、各种大小的 UIImages 等)。我构建了一个数据管理单例,将其全部保存在一个地方并处理服务器更新请求。它工作好的。如果我当时知道我现在所知道的,我可能会制定一个 Core Data 同步策略。
【讨论】:
嗯,就数据抽象而言,它可能有点不安全,但我相信它在内存中也是一个方便的地方。你应该做的,可能是用访问器方法封装变量,这样你就有地方做并发相关的操作(如果有的话)
但是,如果您的意思是将对象从一个 UI 类传递到另一个,那么您可能应该使用其他东西,例如设置另一个的成员变量,或者使用数据存储等。
【讨论】:
对于与整个应用程序相关的少量控制器代码,我使用 AppDelegate。如果有一种明智的方法可以将代码拆分成一个单独的控制器对象,那么这将是更可取的,因为我已经看到应用程序委托已经膨胀到无法管理的大小。
这也是一种“单例化”控制器对象的好方法,如果您以后想拥有多个控制器对象,则不会烧毁您的桥梁。
我实际上在 AppDelegate 上放了一个类方法来访问它,所以我可以执行以下操作:
[[AppDelegate get].dataStore getRecordNumber:x] // or
[[AppDelegate get].server refreshData]
但我敢肯定,有些人认为这是团队设置中的糟糕设计。
【讨论】: