[Objective-C] CGD를 사용한 싱글톤 구현하기 (공유 인스턴스)

어떤 클래스의 인스턴스를 공용으로 만드는 것은 사실 알게 모르게 많이 사용하고 있는 패턴이다. 예를 들어 [NSFileManager defaultManager] 라든가 [UIApplication sharedApplication], [NSNotificationCenter defaultCenter] 같은 것들이 공용 인스턴스가 될 것이다.

이는 싱글톤이라는 패턴이라고 하는데, 그러니까 단 하나만 존재한다는 뭐 그런 의미겠지. 암튼 싱글톤을 만드는 방법은 좋은 점도 있겠지만 글로벌하게 접근하는 객체를 위해서 만들기에는 좀 부담스럽지 않은가 하는데, 아래와 같은 방법을 통해 (이는 전통적인 싱글톤 구현방법은 아니라고 한다.) 손쉽게 만들 수 있다. 이는 코드를 그대로 가져다 붙이기만 하면 되고, 빠르고, ARC의 적용을 받으며, 멀티스레드 환경에서도 안전하게 동작한다.

+(id)sharedInstance
{
    static dispatch_once_t pred = 0;
    __strong static id _sharedObject = nil;
    dispatch_once(&pred, ^{
            _sharedObject = [[self alloc] init];
            });
    return _sharedObject;
}

싱글톤에 대한 애플 개발자 문서의 설명은 다음과 같다.

싱글톤 클래스는 애플리케이션에서 얼마나 요청하든 상관없이 하나의 인스턴스만을 만드는 클래스이다. 주로 앱의 자원에 액세스하는 글로벌 인터페이스를 만드는데 사용될 수 있다. 예를 들어 다른 객체에 사운드를 제공하는 클래스를 만들었다면 이를 싱글톤으로 활용하면 된다.