选择单身人士还是分类?

Cod*_*aFi 5 singleton animation objective-c categories ios

在我的应用程序的早期,当我的经验比我现在少得多时,我想用我自己的自定义动画为视图控制器之间的一些过渡增添趣味.我不知道从哪里开始,我环顾四周寻找像MVC这样的模式,可以随时从几乎任何控制器访问,事实证明,单身就是最佳选择.

我没有意识到的是,对单身人士模式似乎有一种强烈而善意的仇恨,而我自己也开始明白为什么,但这不是重点.

所以,不久之后,我决定将我的相同实现移动到UINavigationController上的一个类别(毕竟,它处理转换!),保留原始类以进行比较,并且想知道哪种方法最有效.在对这两种实现进行全面测试后,我可以毫无疑问地说它们在各个方面都是相同的,包括速度,准确度,平滑度,帧速率,内存使用等等,那么从总体可维护性的角度来看哪一个更"好"?

编辑:在阅读了你们所写的精心编写的论点后,我决定使用单例.@JustinXXVII已经提出了最有说服力的论点(恕我直言),虽然我认为这里的每个答案同样值得.谢谢大家的意见,我在问题中提出了所有答案.

ggr*_*ana 6

我认为最好的选择是使用该类别.

因为如果你已经在使用UINavigationController,那么创建一个只管理转换的新类是没有意义的,就像你告诉的那样: (after all, it handles transitions!)

这将是维护代码的更好选择,并且您将确保事情做他们期望做的事情,如果您已经有一个实例进行转换,为什么要创建另一个?

设计模式,如单件,工厂和其他,需要负责任地使用.在你的情况下,我不明白为什么使用单例,你只使用它来实例化新对象,你真的不需要只有一个实例,但是你这样做是因为你只想要一个.


Jus*_*tin 3

我将阐述单例对象的情况。UIKit和中到处都使用单例iOS。对于类别不能做的一件事是添加实例变量。这有两件事:

  1. MVC 工作流程不允许对象对其他对象有深入的了解
  2. 有时你只需要一个地方来引用一个并不真正属于其他任何地方的对象

这些事情是相互矛盾的,但是能够保留实际上没有“所有者”的实例变量的附加能力是我喜欢单例的原因。

我通常在所有 XCode 项目中都有一个单例类,它用于存储“全局”对象并执行我不想给 AppDelegate 带来负担的平凡事情。

一个例子是序列化/归档对象和取消归档/恢复。我必须在多个类中使用相同的方法,我不想使用某些序列化方法来扩展 UIViewController 来写入和读取任意文件。也许这只是我个人的喜好。

我可能还需要一种快速方法来查找 NSUserDefaults 中的信息,但不想总是编写[[NSUserDefaults standardUserDefaults]stringForKey:@"blah"],因此我只需在我的单例中声明一个采用字符串参数的方法。

到目前为止,我还没有真正考虑过对这些东西使用类别。但有一件事是肯定的,当我只能有一个活的对象留在周围并为我处理事情时,我宁愿不实例化一个新对象一百次来完成相同的任务。(不增加AppDelegate的负担)