다양한 Singleton class template들이 있는데요. Thread Safe 하냐 부터......


Thread Safe한 것들 중에도 어떤게 성능이 더 좋은가? 까지...


일단 가장 기본 구조를 보면 아래와같다

+(MyClass *)sharedInstance{ static MyClass *shared = nil; if(shared == nil) { shared = [[MyClass alloc] init]; } return shared; }


ㅇㅇ Thread safe하지 않은 거 맞다..


+initialize나 @synchronized{}를 이용해서 Thread safe하게 만드는 법이 있지만 @synchronized{}보다는 성능이 좋은 +initialize만 간단히 설명하고 오늘의 본론으로 들어가겠다.


@implementation SomeClass

static id sharedInstance = nil;

+ (void)initialize {
    if (self == [SomeClass class]) {
        sharedInstance = [[self alloc] init];
    }
}

+ (id)sharedInstance {
    return sharedInstance}

@end


GCD를 이용해서 singleton class를 만드는 법을 소개해보도록 하겠다.

WWDC Video 보면 GCD 홍보하면서 상당히 많이 소개된 내용인데. 대충요약해보면 아래와 같다.


+(MyClass *)sharedInstance {

 static dispatch_once_t pred;

 static MyClass *shared = nil;

 

 dispatch_once(&pred, ^{

  shared = [[MyClass alloc] init];

 });

 return shared;

}


구체적인 내용은 알아서들 보기바란다. 그냥 dispatch_once가 App lifecycle동안 단한번만 실행되기 때문에 thread safe가 보장된다.


길다 싶으면 macro로 만들어두고 쓰는 방법도 있다.(참조)


#define DEFINE_SHARED_INSTANCE_USING_BLOCK(block) \
static dispatch_once_t pred = 0; \
__strong static id _sharedObject = nil; \
dispatch_once(&pred, ^{ \
_sharedObject = block(); \
}); \

  return _sharedObject; \


@implementation SomeClass

+ (id)sharedInstance
{
  DEFINE_SHARED_INSTANCE_USING_BLOCK(^{
    return [[self alloc] init];
  });
}

@end


요즘 대세는 GCD ㅎㅎ 참편해~

__block의 경우는 ARC고려해서 만든것 같은데 ARC disable상태면 무시되기 때문에 무시해도 괜찮다.


ARC 관해서는 좋은 링크가 있어서 공유한다. 


나와같이 'ARC는 안쓰는데요~' 하시는 분들도 자세히 공부해둘 필요가 있다.. 왜냐? 요즘 라이브러리 대세는 ARC지원 이거등..


오늘은 여기까지 다음에는 Library에서 ARC지원하는 법에 대해서 설명할 예정임. 

저작자 표시 비영리 변경 금지
신고
1 ... 13 14 15 16 17 18 19 20 21 ... 25


티스토리 툴바