2012-07-17 3 views
2

필자의 연구를 계속하면서이 책은 싱글 톤을 구현했다. 사용하는 이유를 이해했지만 코드에 대한 설명이 필요했습니다.Singleton objective c clarification

+ (BNRItemStore *)defaultStore 
{ 
    static BNRItemStore *defaultStore = nil; 
    if(!defaultStore) 
     defaultStore = [[super allocWithZone:nil] init]; 

    return defaultStore; 
} 

return 문까지 줄을 static BNRItemStore * defaultStore = nil;. 내 질문은; 항상이 클래스를 다른 클래스 또는 앱의 일부인 [[BNRItemStore defaultStore] someMethod];이라고 부르는 defaultStore 변수는 nil로 설정됩니까?

건배 함수 정적 변수의

+1

싱글 톤을 만드는 데 사용하는 방법은 ** threadsafe가 아닌 **입니다. –

+0

고마워, 알아. 이는 단지 구현의 예일뿐입니다. – Camus

답변

3

static 키워드에는 두 가지 효과가 있음을 이해해야합니다. 하나는 변수가 메소드가 호출되기 전에 존재하게하고 반환 된 후에도 계속 유지되므로 다음 호출에서 사용할 수 있습니다. 다른 효과는 더 미묘합니다 - 정적 변수를 초기화하는 "할당"은 코드가로드 될 때 실행되고 메소드가 호출 될 때 실행되지 않습니다. 따라서 모든 호출에서 다시 초기화되지는 않습니다.

변수가 메서드의 "외부"에 있기 때문에 이름이 고유해야합니다.이 클래스 나 다른 클래스의 다른 싱글 톤에서는 같은 이름을 사용하지 마십시오. 당신은, 릴리스, 오토 릴리즈 및 할당 해제의 방법을 유지 아무것도하지 않고 정의해야 ARC를 사용하지 않는 경우 -

+1

변수 이름은 함수 범위에 대해 로컬입니다. –

+0

@ NikolaiRuhe - 나는 그것에 의지하지 않을 것입니다. –

+1

첫 번째 단락에 +1, 두 번째 단락에 대해 -1 –

1

라인

static BNRItemStore *defaultStore = nil; 

할당 아니다. 오히려 정적 초기화입니다.이 코드는 처음 코드가 사용자의 기능을 통과 할 때 한 번 발생합니다. 후속 호출에서 값이 nil이 아닌 것은 nil이 아닌 값을 지정하기 때문입니다.

구현 내용은 단일 스레드 환경에서 안전합니다. 동시 환경의 경우, 어떤 형태의 동기화를 추가해야합니다.

2

정적 저장 기간이있는 변수의 초기화 프로그램입니다. 이 값은 실행 파일이 메모리에로드 될 때 설정됩니다. 정적 저장 기간이 모든 변수가 자동 기능/방법은 처음 호출 단지 한번 초기화 0

0

정적 변수로 설정 될 때의 불필요 명시 전무로 값을 설정하는 것을

참고. 그 후, 당신은 기본적으로 그 선이 존재하지 않는다고 가장 할 수 있습니다.

-1

애플은 위의 코드는 ARC를 가정 다음

+ (BNRItemStore *)defaultStore 
{ 
    static BNRItemStore *defaultStore = nil; 
    static dispatch_once_t done; 
    dispatch_once(&done, 
        ^{ defaultStore = [BNRItemStore alloc]init];}); 
    return defaultStore; 
} 

같은 것을 권장합니다.

+0

이 코드는 여기에 싱글 톤을 사용하는 방식과 동일한 효과가 있습니까? – Camus

+0

스레드를 안전하게합니다. – John

+0

확인. 고마워요 전나무 대답 – Camus