首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >单例类与单例方法的区别?

单例类与单例方法的区别?
EN

Stack Overflow用户
提问于 2018-03-19 17:00:51
回答 1查看 167关注 0票数 1

我有一个问题。

单例类和单例方法的区别是什么?我已经创建了共享实例方法,如果我使用alloc方法,它是否会创建新实例?提前感谢

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-03-19 20:00:54

“单例模式”(或“单例类”或“单例类”)只是任何只允许单个实例执行的类。

“单例方法”将引用为访问实例而写入的方法。(如今,在Swift和Objective中,公共接口将声明一个属性来访问单例,而不是一个方法,但想法是一样的。)

通常,“单例模式”指的是一个简单地不允许创建额外实例的类。但是,应该注意的是,在存在单个共享实例的情况下,术语"singleton“有时使用得更松散,但实际上您可能也允许创建自己的实例。这方面的一个例子是NSURLSession,它的sharedSession属性在苹果文档中被称为“单例”,但仍然允许创建自己的自定义NSURLSession会话。

总之,您是否能够或不能实例化其他实例是类的设计问题。(许多人孜孜不倦地坚持这就是“独生子女”的真正含义。我不打算参加那次辩论。)在许多情况下,我们明确希望防止意外创建实例。但是,在其他(更罕见)情况下,您可能希望同时允许单例以及创建附加实例的能力。这只是一个关于独生子女阶级意图的问题。

注意,您的问题最初被标记为目标-c。目标-C实现可能如下所示:

代码语言:javascript
复制
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

代码语言:javascript
复制
@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

注意:

  1. 现在,人们通常会在公共接口中定义要通过@property访问的单例,而不是作为一种方法。该属性将声明为classreadonly,然后手动实现该属性的getter访问器方法。 通过将此公共接口定义为属性而不是方法,如果您通过Swift与此对象进行接口,您将使用Swift中更常见的模式访问它。您不必将其定义为属性,但通常是这样的。
  2. 请注意,我将此属性定义为sharedFoo,而不是sharedInstancesharedManager。通过将其命名为sharedFoo,当您将此代码与Swift连接起来时,它将自动公开为shared,这是Swift作为惯例为其单例和其他共享实例使用的更简洁的名称。
  3. 在本例中,我将initnew声明为unavailable。这将防止开发人员意外地实例化其他实例。同样,这也是单身人士的目的问题。

如果您查看整个Cocoa中的单例(或其他共享实例),就会发现Apple已经过渡到了这种属性方法。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49368498

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档