2014-06-23 2 views
2

내 용도로 싱글 톤 클래스를 만들고 있습니다. 싱글 톤 클래스의 코드는 다음과 같습니다.매 시간마다 싱글 톤 클래스 정적 변수를 0으로 설정합니다.

//First Example 

+ (id)sharedManager { 
    static MyManager *sharedMyManager = nil; 
    static dispatch_once_t onceToken; 
    dispatch_once(&onceToken, ^{ 
     sharedMyManager = [[self alloc] init]; 
    }); 
    return sharedMyManager; 
} 


//Second Example 

static SingletonSample *sharedObject; 

+ (SingletonSample*)sharedInstance { 
    if (sharedObject == nil) { 
     sharedObject = [[super allocWithZone:NULL] init]; 
    } 
    return sharedObject; 
} 

초는 잘 보입니다. 하지만 나는 sharedMyManager가 매번 nil로 설정되고 매번 공유 관리자가 할당되는 첫 번째 예제에서 혼란 스럽습니다. 첫 번째 예제가 클래스의 동일한 참조 (Singleton)를 반환하는 방법에 대해 의문의 여지가 있습니다.

감사합니다.

답변

5

우선 static이 in 함수로 선언 될 때, 그것은 한 번만 선언됩니다. 따라서 라인은

static MyManager *sharedMyManager = nil; 

처음으로 함수가 호출 될 때 한 번만 실행됩니다.

dispath_once을 사용할 때 다음 줄에는 한 번만 실행됩니다. 따라서 sharedMyManager의 생성은 한 번만 수행됩니다. 그렇기 때문에 단일 톤 클래스를 만드는 데 완벽한 방법입니다.

2

이므로 처음에는 nil으로 설정되지만 이후 호출에서는 이전 호출에서 설정 한 값이 그대로 유지됩니다.

첫 번째 예제는 스레드로부터 안전하기 때문에 더 좋습니다. 두 번째 예제는 심지어 위험한 sharedObject을 초기화하지 않습니다 (글로벌 변수가 0으로 초기화된다는 보장이 없다고 생각합니다).

+0

C에서 "전역"개체에 대한 보증이 있으며 '__unsafe_unretained'로 정규화 된 참조를 제외하고는 ARC를 사용할 때 Objective-C에 참조가 있음을 보장합니다. (이 보증은 "로컬"객체에도 적용됩니다.) –

+0

@ AminNegm-Awad OK 환호성. 그러나 나는 항상 명시 적으로 초기화 할 것이다. – trojanfoe

+0

나도. 그러나 코드는 여전히 정확합니다. –

1

sharedMyManager is set to nil each time

정적 변수 한번만 설정한다.

there is a allocation of shared manager each time

당신은 dispatch_once를 사용하므로 너무 잘못입니다.

dispatch_once here에 대해 읽어보십시오. 그리고 GCD를 사용하는 것이 더 빠르고 스레드로부터 안전합니다.

+1

"매번"설정됩니까? 아니, 그렇지 않아. – trojanfoe