싱글톤은 SharedInstance
라는 명목으로 코코아 내에서도 상당히 자주 쓰이는 패턴이다. SharedApplication이나 NSFileManager, NSNotificationCenter 등에서 많이 활용된다. 쉽게 생각하면 다음과 같은 식으로 구현하면 될 것이라 보는데…
static SomeClass *sharedObject;
+ (SomeClass *)sharedInstance {
if (sharedObject == nil) {
sharedObject = [[self alloc] init];
}
return sharedObject;
}
문제는 프로그램 동작 초기에 여러 스레드에서 매우 근접한 시차를 두고 해당 메소드가 불리면, 여러 개의 인스턴스가 생성되고 싱글톤은 의도한 대로 동작하지 않게된다.
가장 확실한 방법은 dispatch_once
를 사용하는 것이다.
+ (id)sharedManager {
static id _sharedInstance = nil;
static dispatch_once_t onceToken;
dispatch_once(&onceToken, ^{
_sharedInstance = [[self alloc] init];
...
});
return _sharedInstance;
}
추가
보통 블로그 글은 몇 달 전에 써 두고 그걸 다시 두 세달 전에 스케줄링하는 거라… 그 사이에 스위프트가 나와버렸음;;;;
스위프트에서는 다음과 같이 추가하면 된다.
class Singleton {
class var sharedInstance : Singleton {
struct Static {
static var onceToken:dispatch_once_t = 0;
static var instance : Singleton? = nil;
}
dispatch_once(&Static.onceToken) {
Static.instance = Singleton();
}
return Static.instance!;
}
}