我有一个问题。
单例类和单例方法的区别是什么?我已经创建了共享实例方法,如果我使用alloc方法,它是否会创建新实例?提前感谢
发布于 2018-03-19 20:00:54
“单例模式”(或“单例类”或“单例类”)只是任何只允许单个实例执行的类。
“单例方法”将引用为访问实例而写入的方法。(如今,在Swift和Objective中,公共接口将声明一个属性来访问单例,而不是一个方法,但想法是一样的。)
通常,“单例模式”指的是一个简单地不允许创建额外实例的类。但是,应该注意的是,在存在单个共享实例的情况下,术语"singleton“有时使用得更松散,但实际上您可能也允许创建自己的实例。这方面的一个例子是NSURLSession,它的sharedSession属性在苹果文档中被称为“单例”,但仍然允许创建自己的自定义NSURLSession会话。
总之,您是否能够或不能实例化其他实例是类的设计问题。(许多人孜孜不倦地坚持这就是“独生子女”的真正含义。我不打算参加那次辩论。)在许多情况下,我们明确希望防止意外创建实例。但是,在其他(更罕见)情况下,您可能希望同时允许单例以及创建附加实例的能力。这只是一个关于独生子女阶级意图的问题。
注意,您的问题最初被标记为目标-c。目标-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中的单例(或其他共享实例),就会发现Apple已经过渡到了这种属性方法。
https://stackoverflow.com/questions/49368498
复制相似问题