/ iOS

Objective-C 单例模式

注:这里的代码使用自动引用计数(ARC),不涉及非 ARC 下的实现。

代码

// singleton.h
@interface Singleton : NSObject  

@property (nonatomic, retain) NSString *string;  
  
+ (id)sharedInstance;  
  
@end  
// singleton.m
#import "singleton.h"  
  
@implementation Singleton

@synthesize someProperty;  

#pragma mark Singleton Methods  
  
+ (id)sharedInstance  
{  
    static Singleton *sharedInstance = nil;  
    static dispatch_once_t onceToken;  
    dispatch_once(&onceToken, ^{  
        sharedInstance = [[self alloc] init];  
    });  
    return sharedInstance;  
}

- (id)init  
{  
    if (self = [super init])  
    {  
        self.string = [[NSString alloc] initWithString:@"default string"];  
    }  
    return self;  
}  

解析

与单例模式传统的实现方式不同,上面的代码使用 GCD 的 dispatch_once 方法来确保 sharedInstance 只会被初始化一次。

这种实现方式的优缺点

线程安全。使用 GCD 的 dispatch_once 保证只初始化一次。

启动时加载,好像不能实现延迟加载(第一次使用时加载)

参考