GCD를 이용한 Objective-C Singleton Pattern의 구현

iOS 프로젝트를 진행하다 보면, 수도 없이 많은 Singleton 객체를 생성하게 된다.
Java나 Swift처럼 간단하게 private init을 구현해서 Singleton을 구현하면 좋겠지만, Objective-C에서는 이러한 부분이 불가능하다.

이를 극복하기 위해서 GCD(Grand-Central-Dispatch)를 사용하여 간단하게 Singleton 객체를 생성하고 이용할 수 있다.
코드는 아래와 같다.

+ (instancetype)sharedInstance {
    static TypeOfClass *aAccessor = nil;
    static dispatch_once_t aAccessorInstanceInvoked = 0;
    dispatch_once(&aAccessorInstanceInvoked, ^{
        aAccessor = [self new];
    });

    return aAccessor;
}

먼저, Class Method로 sharedInstance를 생성한다. 이 때, 반드시 헤더에도 선언이 되어 있어야 클래스 외부에서 사용이 가능하다. (당연한 이야기..)
static 으로 선언된 Accessor는 Singleton으로 사용될 객체 자신의 타입을 적으면 된다.
static으로 선언되었기 때문에 해당 클래스 내에서 언제든 접근이 가능하다.
그러고 나면, dispatch_once_t 타입의 일명 onceToken 을 static으로 선언한다. 이 변수를 통해서 아래 dispatch_once블럭의 실행 유무를 확인할 수 있게 된다.

위와 같은 준비가 끝나고 나면, 드디어 GCD의 dispatch_once 블록을 통해 객체를 인스턴스화 하게 되는데, 위와 같은 패턴으로 코딩하게 되면 앱이 실행되는 순간부터 종료되는 순간까지 dispatch_once 블럭 안의 코드는 오직 1번만 실행되게 된다.

이러한 특징을 통해 Singleton Pattern을 구현할 수 있게 된다.

댓글 남기기