gpt4 book ai didi

ios - 使用单例作为数据管理器类不好吗?

转载 作者:可可西里 更新时间:2023-11-01 03:31:57 26 4
gpt4 key购买 nike

我通常创建需要存储数据的应用程序,并且该数据会在整个程序中使用。不过,它并不多,所以我通常使用 NSUserDefaults 来加载/保存这些数据。但是,保存/加载代码以及打包/解包数据会占用空间,我认为将此代码移动到全局单例中的可重用方法是个好主意。它似乎运作良好。

尽管如此,最近我读了很多关于单例和全局对象的弊端,我开始重新考虑。人们常说,单例的使用几乎总是设计不佳的标志。在大多数情况下,我不同意(我认为像这样的简单使用是一种很好的设计模式),但我当然不是这方面的专家。

那么,即使以这种简单的方式使用单例也不好吗?如果是这样,更好的选择是什么?

最佳答案

我绝对不同意单例是邪恶的。它们有时可能被过度使用,但在某些情况下非常适合这项工作。在某些应用程序中,拥有某种通用数据管理器是有意义的。单例模式广泛用于 SDK 本身(应用程序委托(delegate)、共享管理器、默认中心等)。大多数情况下,这些不是“纯”单例,因为您可以访问共享实例,但也可以在必要时创建新实例。

您需要问自己的问题是,随时随地访问数据管理器的单个实例是否有用,如果没有用,则可能不需要单例。但是,如果你打算在多线程环境中使用单例,你确实需要担心竞争条件(一个线程是否可以在另一个线程访问资源时修改资源),文档对如何在 Cocoa 中最好地实现这一点有很好的解释.

让我试着用一个例子来解释 - 我正在使用我编写的游戏中的一些代码。假设您有一个 GameMap 类和一个 Tile 类。 GameMap 表示 Tile 对象的二维网格。

GameMap *gameMap = [[GameMap alloc] init];
NSArray *theTiles = gameMap.tiles;

GameMap 的实例拥有图 block 网格,并在创建游戏 map 时创建图 block 。不需要单例。

您可能会说“但我一次只有一个 GameMap,这有什么大不了的?”。载入保存的游戏或载入新关卡怎么样?好吧,这变得很简单:

// In whatever class object owns the game map
self.gameMap = [[GameMap alloc] initWithSaveData:saveData];

总而言之,创建一个类的实例,该实例具有用于管理事物的其他实例的代码。尽可能少地全局化,您的代码将更具可扩展性和可维护性。

关于ios - 使用单例作为数据管理器类不好吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8707891/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com