Objective C 的单例模式 Singleton with ARC

目前了解到Objective C 实现singleton有3种方式

1.Initialize方法实现

static MySingleton *sharedSingleton;

+ (void)initialize
{
    static BOOL initialized = NO;
    if(!initialized)
    {
        initialized = YES;
        sharedSingleton = [[MySingleton alloc] init];
    }
}

Note: 若该类有子类,那么会返回父类的实例而非我们期望子类的实例,因此要清楚的知道该单例有无子类。

可用 self == [MySingletonClass class] ]进行判断,或者子类要override父类的initialize方法,该方法有时会比dispatch_once()方法要快。

Update for 子类initialize方法的影响

<span style="font-family:Microsoft YaHei;">@implementation MySingletonClass
static MySingletonClass * _instance;
+ (void) initialize {
   if (self == [MySingletonClass class]){
      _instance = [[MySingletonClass alloc] init];
   }
}

- (id) init {
   ZAssert (_instance == nil, @"Duplication initialization of singleton");
   self = [super init];
   if (self) {
      // Initialization
   }
   return self;
}

+ (id) getInstance {
   return _instance;
}
@end</span>

Objective-C: init vs initialize

2.synchronized方式

@interface MySingleton : NSObject
{
}

+ (MySingleton *)sharedSingleton;
@end

@implementation MySingleton

+ (MySingleton *)sharedSingleton
{
  static MySingleton *sharedSingleton;

  @synchronized(self)
  {
    if (!sharedSingleton)
      sharedSingleton = [[MySingleton alloc] init];

    return sharedSingleton;
  }
}

@end

3.dispatch_once方式

+ (instancetype)sharedInstance
{
    static MyClass *sharedInstance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        sharedInstance = [[MyClass alloc] init];
        // Do any other initialisation stuff here
    });
    return sharedInstance;
}

 
 dispatch_once()是同步的,即便多线程访问也是安全的,并非所有的GCD方式都是同步的,dispatch_once()比synchronizeed方法更快,且仅被调用一次,推荐使用dispatch_once方式。
Reference List:
  1. What should my Objective-C singleton look like?
  2. Why does Apple recommend to use dispatch_once for implementing the singleton pattern under ARC?
  3. Singleton with ARC





  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值