2014-08-31 4 views
0

싱글 톤에 대해 배우기 위해 한 가지 예를 따르지만 코드와 혼동되지 않습니다. 특히 정적 변수를 사용하는 경우에는 혼란 스럽습니다. 다음은 코드입니다. 첫 번째 변수가 초기화 된 코드인지 확인합니다.정적 변수를 초기화 한 후 nil을 가리키지 않는 이유는 무엇입니까?

+ (instancetype)sharedStore 
{ 
    static BNRImageStore *sharedStore = nil; 

    if (!sharedStore) { 
     sharedStore = [[self alloc] initPrivate]; 
    } 
    return sharedStore; 
} 

은 처음의 initPrivate 인 경우 : 메소드가 호출됩니다 :

- (instancetype)initPrivate 
{ 
    self = [super init]; 

    if (self) { 
     _dictionary = [[NSMutableDictionary alloc] init]; 
    } 
return self; 
} 

내가 코드의 첫 번째 부분에 문제가있는, sharedStore로 : 방법. 이 변수 sharedStore가 데이터를 유지할 수있는 방법은 매번이 메소드를 호출하여 singleton을 얻거나 sharedStore가 nil을 가리 키도록하는 경우입니다.

코드가 올바르게 작동하므로 문제가 없습니다. 변수가 정적이면 static BNRImageStore *sharedStore = nil;은 무시됩니다.

미리 감사드립니다. 위의 코드는 "IOS 프로그래밍 : The BNR Guide"라는 책에서 가져온 것입니다.

답변

0

sharedStore가 정적 변수이며 로컬 변수가 아니라는 것이 문제입니다. 정적 변수는 절대 파기되지 않습니다. 정적 변수는 스택에 존재하지 않으므로 nil로 설정해도 정적 변수가 삭제되지 않습니다. 따라서 여기에 표시 한 경우에는 아무 것도 설정하지 않는 설정이 만들어지며 조건을 설정하지 않습니다. 조금 직관적이지만이 방법으로 작동합니다. Why should you check a static variable for nil if it was initialized to nil on the previous line? 즉 :

이 정적 특성을 보여주는 간단한 방법은 여기에 코드에서 제공되는

void plugh(void) { 
    static int xyzzy = 0; 
    printf (" %d", xyzzy); // or Obj-C equivalent. 
    xyzzy++; 
} 

및 생산합니다 100 번으로 전화 :

0 1 2 3 4 ... 

은을 팔고 다니다하는 또 다른 방법있다 dispatch_once를 사용하는 싱글 톤. 예를 http://www.raywenderlich.com/59255/afnetworking-2-0-tutorial

+0

감사의 특별한 경우이다. 그것은 BNRImageStore * sharedStore = someOtherBNRImageStoreVariable을 의미합니까? 아무 것도 변하지 않을거야. –

+0

음 ... 당신이 코멘트에서 묻고있는 것에 대해 100 %는 안된다. 일반적으로 NSMutableDictionary의 경우 공유 저장소와 같은 객체는 백킹 객체와 비슷하며 액세스하거나 추가 할 수있는 메소드를 제공합니다. 그래서 보통 [[BNRImageStore sharedInstance] addObect : obj forKey : key]와 비슷합니다; 또는 그런 것. – timpone

+0

우리가 sharedStore 포인터가 nil을 가리킬 때 내 질문은 이전에 가리키고 있던 데이터의 메모리 주소를 잃어 버리지 않는다는 것을 의미하지 않는다. –

0

정적 변수는 한 번만 따라서 코드를 초기화하는 sharedWeatherHTTPClient 여기에서 제공되는 static BNRImageStore *sharedStore = nil; 의지는 상관없이 메소드를 호출하는 횟수를 한 번 실행하지 sharedStore

당신은 C에서 저장 클래스를 공부 할 수

  1. 자동
  2. 통근
  3. 정적이 있습니다
  4. 레지스터

그리고 정적에 대한

  • 초기화 참고

    한 번 수행 varibales : 초기화할당 사이에 차이가 있습니다.

    초기화 : 정의시 값을 할당 할 때. 예 :

    int a = 5; //this is initialization 
    

    할당 : 당신이 정의 한 후 값을 지정합니다. 예 :

    int a = 0; //initialization 
    a = 6; //assignment 
    int b; 
    b = 10 //assignment 
    

    당신은 그 초기화를 말할 수는 할당 답변