我有一个问题。
单例类和单例方法之间有什么区别。我已经创建了共享实例方法,如果我使用alloc方法,是否会创建新实例?提前致谢
“单身模式”(或“单身类”或仅仅是“单身”)就是任何只允许您拥有单个实例的类。
“单一方法”指的是一种为访问实例而编写的方法。(现在,在Swift和Objective-C中,公共接口将声明一个属性来访问单例,而不是方法,但想法是相同的。)
传统上,“单例模式”是指仅不允许创建其他实例的类。但是应该注意,在存在单个共享实例的情况下,有时有时会更宽松地使用术语“单身”,但实际上您也可以允许创建自己的实例。一个示例就是NSURLSession
,其sharedSession
属性在Apple文档中称为“单个”,但仍然允许创建自己的自定义NSURLSession
会话。
最重要的是,是否以可以实例化或无法实例化其他实例的方式设计单例,这是类设计的问题。(许多人坚持认为这就是“单身”的意思。我将不参加辩论。)在许多情况下,我们明确希望避免发生意外的创建实例。但是,在其他(较罕见)的情况下,您可能既要允许单例,又要允许创建其他实例的能力。这只是单身人士班级意图的问题。
请注意,您的问题最初被标记为Objective-c。一个Objective-C实现可能如下所示:
NS_ASSUME_NONNULL_BEGIN
@interface Foo : NSObject
@property (class, strong, readonly) Foo *sharedFoo;
- (instancetype)init __attribute__((unavailable("Use +[Foo sharedFoo] instead")));
+ (instancetype)new __attribute__((unavailable("Use +[Foo sharedFoo] instead")));
@end
NS_ASSUME_NONNULL_END
和
@implementation Foo
+ (Foo *)sharedFoo {
static Foo *sharedFoo = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
sharedFoo = [[self alloc] init];
});
return sharedFoo;
}
- (id)init {
if ((self = [super init])) {
// do additional initialization here
}
return self;
}
@end
注意:
如今,人们通常会定义要通过@property
公共接口中的单例而不是方法来访问的单例。将该属性声明为class
和readonly
,然后您将为该属性手动实现getter访问器方法。
通过将此公共接口定义为属性而不是方法,如果您曾经通过Swift与该对象进行接口,则将使用Swift中更常见的模式来访问它。您不必将其定义为属性,但是通常可以。
请注意,我将此属性定义为sharedFoo
,而不是sharedInstance
或sharedManager
。通过调用它sharedFoo
,当您将此代码与Swift桥接时,它将自动显示为shared
,作为约定,Swift用于其单例和其他共享实例的更简洁的名称。
在这种情况下,我已声明init
和new
为unavailable
。这将防止开发人员意外实例化其他实例。同样,这是单例目的的问题。
如果您在整个Cocoa API中查看单例(或其他共享实例),您会发现Apple已过渡到这种属性方法。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句