[iOS] GCD를 이용한 싱글턴 클래스 구현

GCD(Grand Central Dispatch)을 이용하여 Singleton 패턴을 구현하는 방법을 정리해 봅니다. GCD에서 제공하는 dispatch_once는 단한번만 실행되는 코드 블록을 지정할 수 있습니다. GCD는 쓰레드 세이프하고 OS가 모든것을 관리해준다는 장점이 있습니다.

MyObject.h

#import <Foundation/Foundation.h>

@interface MyObject : NSObject

+ (instancetype)getInstance;

@end

 MyObject.m

#import "MyObject.h"

@implementation MyObject

+ (instancetype)getInstance {
    static MyObject *_instance = nil;
    static dispatch_once_t oncePredicate;
    dispatch_once(&oncePredicate, ^{
        _instance = [[MyObject alloc] init];
    });
    return _instance;
}

@end

.h 파일에서는 getInstance라는 클래스 메소드를 추가하였고 .m에서는 그 실체를 구현하였습니다.

위에서 중요한것은 dispatch_once_t와 dispatch_once의 상관관계입니다. dispatch_once_t는 dispatch_once가 실행되었는지 여부를 저장하고 있는 포인터 변수입니다. 이 값을 보존하지 못한다면 여러번 실행될 수도 있다는 것이 되겠네요.

추가로 기존의 방식으로 싱글턴을 구현하려면 @synchronized를 활용하는 방법이 있습니다.

#import "MyObject.h"

@implementation MyObject

+ (instancetype)getInstance {
    static MyObject *_instance = nil;
    if (_instance == nil) {
        @synchronized (self) {
            if (_instance == nil)
                _instance = [[MyObject alloc] init];
        }
    }

    return _instance;
}

@end

참조 : Apple GCD Reference