싱글톤

싱글톤은 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!;
    }
}