Ios 单例有效使用,目标C

Ios 单例有效使用,目标C,ios,nsmutablearray,singleton,Ios,Nsmutablearray,Singleton,我对设计模式不太了解。我刚刚开始使用单例,我想使用单例在一个集中的位置方便地存储数据,但在这样做之前,我读了一些帖子,似乎说这是不正确的设计(或者我很困惑),但不清楚为什么。我想做的是: 将多个对象数组存储在一个集中的位置,以便可以对这些对象进行持久化处理 如果不是单身,还有更好的方法吗?如果这是一个糟糕的设计,那么最好知道原因。单例模式的有用性和适用性在很大程度上取决于应用它的环境 关于它最大的抱怨是基于单例的代码的可测试性。其他抱怨包括它在并发环境中可能出现的潜在问题,以及试图回收singl

我对设计模式不太了解。我刚刚开始使用单例,我想使用单例在一个集中的位置方便地存储数据,但在这样做之前,我读了一些帖子,似乎说这是不正确的设计(或者我很困惑),但不清楚为什么。我想做的是:

将多个对象数组存储在一个集中的位置,以便可以对这些对象进行持久化处理


如果不是单身,还有更好的方法吗?如果这是一个糟糕的设计,那么最好知道原因。

单例模式的有用性和适用性在很大程度上取决于应用它的环境

关于它最大的抱怨是基于单例的代码的可测试性。其他抱怨包括它在并发环境中可能出现的潜在问题,以及试图回收singleton所拥有的资源时可能遇到的困难

但是,这些问题都不是为iOS开发应用程序的主要问题:

  • 应用程序中的模型通常只有一个单例;您可以使其可交换以确保可测试性,例如,通过读取要从运行时配置实例化的类的名称,或从运行时环境中推断该名称
  • 尽管iOS应用程序使用并发结构,但它们大部分是单线程的
  • iOS应用程序一直运行,直到最终用户杀死它们,此时操作系统会自动回收资源;杀死单身汉并不是一个特别的问题

由于这些考虑,单例模式成为iOS应用程序的一种流行实现技术。只要您知道它的缺点并愿意解决它们,在iOS应用程序中使用单例模式绝对没有错。

许多单例实现都是美化的全局变量。虽然对于那些没有编写和维护过很多代码的人来说,这似乎很好,也很方便,但是使用全局变量存在很多问题,因此许多有经验的开发人员和团队都禁止使用全局变量

…将多个对象数组存储在一个集中的位置,以便可以对这些对象进行持久化处理

即使是一个全局变量也是一个难题,但多个全局变量数组也会带来更大的问题

扪心自问:为什么数组中的所有这些对象必须始终存在,并且程序的任何部分都可以访问它们?只有实现的一部分需要可见,并且在某些时间只有某些部分需要可见。为什么总是要分配和激活这些对象数组创建模型并将其传递,并在需要时将其作为IVAR保存。

此外,如果它们是持久化的,则不必总是加载它们,因为您只需在需要时读取/写入所需内容

使用globals(singleton)只会混淆您的对象依赖关系图(糟糕——维护噩梦)

OP中没有证据表明你的病例是非典型的。虽然现在看来这似乎是个好主意,但今天的便利在将来往往要花很多钱


已经写过很多关于全局变量和单变量的误用,以及它们引入的问题(Objc单点/全局)在这方面与C、C++或java中的实现没有很大的不同。即使是20年前的文章也会有很好的建议——今天的等式更复杂。

我非常同意贾斯汀的观点,因为这种习惯可以转移到其他语言。我想补充一点,当考虑使用单例时,问问自己“我的应用程序只使用这个类的一个实例会有什么好处?”我不是世界上最有经验的程序员,但我还没有找到创建单例的好理由。此外,大多数框架已经附带了合理实现的单例,例如那些访问文件/目录的单例(例如[NSFileManager defaultManager])。即便如此,苹果还是建议:

“如果您计划将委托与文件管理器一起使用以接收 关于完成基于文件的操作的通知,您可以 应创建NSFileManager的新实例(使用init方法) 而不是使用共享对象。”


如果你有任何疑问,这个班不应该是单身学生。

我认为这个问题有点太宽泛了。根据你到目前为止所写的,我可以为每一方想出多个论点。具体来说,你想要完成什么。应该记得,默认情况下提供了一个单例——app委托。从来没有真正需要另一个。但最重要的是要避免出现单件爆炸式增长,每向应用程序添加一个新的数据结构,就有一个单件。这表明设计考虑不周。@Wolfy先生如果要使用单例,应仅用于模型,而不用于视图或控制器。视图是在你打开屏幕时动态创建的,控制器也是如此;模型在你的单身生活中保持不变。@Wolfy先生不,它没有。将视图显示的数据存储在全局可变数组中可能没有问题,但存储视图对象本身几乎肯定是错误的:除了您自己的视图之外,访问视图没有任何意义,因此不应该有理由需要全局视图数组。视图之间不应该直接对话,只能通过模型进行对话。一个视图可能会更改为另一个视图的使用而存储的值,然后另一个视图将能够正确显示该值。很好。苹果自己的代码就是一个很好的例子。他们通常有一个很好的平衡,并就何时使用和避免单身做出了很好的决定。我想我们经常被“如果”所包围。你一针见血——是的,单身会让测试变得不那么纯粹,而且可能不准确,但这通常不是90%的人关心的问题