我的应用程序项目包含几个助手类,它们服务于各种不同的目的(例如时间/日期/计算、数据库访问等)。初始化这些类是非常昂贵的,因为它们包含一些需要从数据库填充或每次创建新实例时都需要重新计算的属性。为了避免性能问题,我倾向于在应用程序委托中初始化这些类中的每个类,并将它们从viewController传递给viewController。
这对我来说已经有一段时间了,但我现在发现,应用程序越复杂,我遇到的问题就越多。大多数问题与类在循环引用中纠缠在一起有关。我想知道如何正确地解决这个问题,我已经考虑过将每个helper类转换为单例,并使用单例而不是传递类实例。但是由于一些助手类是相互依赖的,我会让单例调用其他单例,我似乎不知道这最终会不会导致其他问题。有人对此有什么建议吗?
发布于 2010-11-04 22:10:58
单例的问题是,它们使得模拟和单元测试应用程序变得更加困难。你应该解耦你的依赖关系;如果你确实需要一个单例(这应该是非常非常罕见的),那么考虑让单例实现一个接口,你可以出于测试目的模拟这个接口。
发布于 2010-11-04 22:14:25
每当我想使用单例时,我就会重新阅读Global Variables are Bad,并考虑是否真的值得忍受这个(稍微)改述的问题列表:
(方法和变量的非局部性测试没有访问控制或约束)
发布于 2010-11-04 22:37:18
单例基本上是全局变量,创建全局变量只是为了避免传递东西,这不是一个好主意。不过,通常正确的做法是简单地将对象从一个类传递到另一个类。诀窍是找出您可以传递的最小数据量,以最小化耦合。这就是设计良好的类很重要的地方。例如,您很少需要传递一个NSManagedObjectContext,因为您可以从任何NSManagedObject获取它。
现在,让我来处理创建代价高昂的对象的具体情况。您可以尝试使用pooling those objects,而不是在每次需要时都创建它们。数据库访问就是一个很好的例子。您可以从缓存中获取一个数据库连接,而不是每次请求一个数据库连接时都分配一个。当然,当缓存为空时,您需要分配一个缓存。而且,出于内存原因,当系统要求您清空缓存时,您应该愿意并且能够清空缓存。
创建对象的开销对用户来说应该无关紧要。这是一个实现细节,但您可以围绕它进行设计。您必须小心,因为只有不具有可变状态的对象才能以这种方式处理,所以如果您想走这条路,您可能必须重新考虑类的设计。
https://stackoverflow.com/questions/4097322
复制相似问题