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