我已经阅读了几个关于单身人士和班级在不同语言中的差异的线索,但没有(我能找到)特定于Objective-C的。
他们看起来和我很相似。
我是Objective-c的新手 - 那么Singletons和Classes之间的差异或用例是什么?
答案 0 :(得分:4)
您正在使用Objective-C编程,这是一种面向对象的编程语言(OOP)。因此,要了解类是什么,您必须首先了解OOP概念。
我不会讨论为什么开发 OOP语言而不是程序语言。你可以谷歌“程序性和客观性的优势”。
反正 面向对象编程语言(OOP)提供了帮助您实现OOP原则的机制/设备/结构。 3个主要原则是(1)封装(2)继承(3)多态。谷歌再次找出这些是什么。
现在类:将是实现3 OOP原则的机制/设备/结构之一。它是对象应该是什么的蓝图/设计/结构。 通常(但不总是)类会有(1)在其中声明的变量(字符串,整数,数组等)和(2)对其中声明的变量执行任务的方法/函数。当您实例化/分配/创建该类内存时,该类将变为“活动”。蓝图现在变成了一个对象(一个实现你应该谷歌的OOP原则的对象)。
现在 Singleton 是一种设计模式。如果您来自过程语言环境,那么您可能需要了解许多编程设计模式。单身人士是一种模式/特定方式 - 你设计的方式。所以当你说一个单例类时,这是你设计该类的一种特殊方式。那个特别的设计是什么?好吧,通常在实例化/分配/创建内存中的类时,您可以通过创建该类的多个实例化对象来多次执行此操作。但是,如果将单例设计模式应用于类,则可以确保只能创建一个实例(并且只能创建一个实例)。
在Objective-C中如果我做这样的事情:
myClass *anObjectOfMyClass1 = [[myClass alloc] init];
// This (above) would create an object from the blueprint *myClass* and assign it to *anObjectOfMyClass1*
myClass *anObjectOfMyClass2 = [[myClass alloc] init];
// This would create an object from the blueprint *myClass* and assign it to *anObjectOfMyClass2*
// Note: anObjectOfMyClass1 and anObjectOfMyClass2 would contain two different objects of the same type
// If *myClass* was designed using singleton pattern however, anObjectOfMyClass1 and anObjectOfMyClass2 would typically contain the same object.
简而言之......你真的无法比较这两者。 至于单身人士的用法..我会说Loggers。我认为关于单例使用的stackoverflow已经有了答案。环顾四周。
答案 1 :(得分:2)
在我听说的每种编程语言中,单例是design pattern,它规定给定类只存在一个实例 - 而在一个普通的类中,有很多实例可以创建它。
编辑:
正如评论中所提到的,here是文档中的相关引用:
无论应用程序请求多少次,单例类都会返回相同的实例。典型的类允许调用者根据需要创建尽可能多的类实例,而对于单例类,每个进程只能有一个类的实例。单例对象提供对其类资源的全局访问点。单身人士用于需要这个单一控制点的情况,例如提供某些一般服务或资源的类
答案 2 :(得分:1)
Singleton是一种设计模式,类是面向对象编程的范例。你无法真正比较这两者。
答案 3 :(得分:0)
面向对象的概念和模式是从用于实现它们的技术/语言中抽象出来的。换句话说,Class
的含义在所有面向对象语言中都是相同的,Singleton
是可以在任何面向对象语言中实现的模式
答案 4 :(得分:0)
嗯,一个类是定义的结构。把它想象成椅子或其他东西的蓝图。你的椅子是对象,而“蓝图”就是这个类。 Singleton是一种类模式,因此是一种做类的方法。
单例基本上有一个指向类中自身实例的指针。你有一个方法来获得该实例。但是你不能创建这个类的新对象。你只能得到一个对象。这有点像拥有一个全局变量。您始终可以访问该对象。
我在语言课,翻译课等中使用单身人士
修改强>
从未做过很多Objective-C,但它仍然是面向对象的编程,所以它在任何语言中都是相同的模式。
就个人而言,如果您想在多个视图之间共享,我会选择Singleton。我有一个看起来像单身的模式,但是对于多个实例。对于我的一个项目中的Locale类,我有多个Locale实例,但我的Locale类中有一个getInstance方法(构造函数是私有的,所以我不能在它自己之外初始化这个类)。所以我将我想要的语言环境传递给getInstance方法,并检查包含所有先前实例的私有数组,如果它不在数组中,那么它会创建该Locale的新实例并将其添加到数组中。所以它与Singleton相同,但是有一个实例数组,而不仅仅是一个实例。