2011-01-23 3 views
0

동기화 된 함수가 있지만 해당 블록의 인스턴스 변수 값을 직접 변경할 수없는 것으로 보입니다.Objective C에서 동기화 된 블록의 인스턴스 변수 설정

+(id)allocWithZone:(NSZone *)zone 
{ 
@synchronized(self) { 
    if (sharedInstance == nil) { 
     sharedInstance = [super allocWithZone:zone]; 

     //This is not allowed 
     something = @"hello"; 

     //This is allowed 
     self.something = @"hello world!"; 

     return sharedInstance; 
    } 
} 

return nil; 
} 

왜 이런 경우입니까? 직접 액세스해야하는 변수가 있습니다 (변수를 합성하고 싶지 않습니다). 이 문제를 어떻게 해결할 수 있습니까?

+0

"허용되지 않습니까?" 이 코드는 컴파일되지 않습니까? 런타임에서 오류를 트리거 하시겠습니까? 충돌이 발생하면 충돌의 세부 사항을 제공 할 수 있습니까? – Tim

+0

@Darren 인스턴스 메서드와 같은 클래스 메서드를 처리하고'-init'이 호출되기 전에 ivars를 설정하려고한다는 사실부터 시작하여 많은 잘못되었습니다. –

+0

@Kevin하지만 싱글 톤 개체의 경우 클래스 메서드 (+로 시작하는)는 인스턴스 메서드 (-)와 실제로 동일합니다. –

답변

5

인스턴스 변수가 인스턴스 메서드가 아니므로 변경할 수 없습니다. self의 값은 사실 클래스 자체입니다. 코드 줄 self.something = @"hello world!"도 작동하지 않습니다. 정말로 원하는 것은 sharedInstance.something = @"hello world!"이며 something이 속성 인 경우에만 작동합니다. init 메소드에서 ivars를 설정하는 것이 더 좋습니다.

오, 어쨌든 +allocWithZone:에는 사업용 설정이 없습니다. 개체가 아직 초기화되지 않았습니다.

여기에 싱글 톤을 만들려고한다고 가정하면 (이 모양은 같습니다) Obj-C의 싱글 톤에서 blog post을 읽을 수 있습니다.

+0

감사합니다. 매우 도움이됩니다. 예 sharedInstance.something이이 경우에 작동합니다. 사실 싱글 톤을 만들면서이 블로그 게시물을 따랐습니다. http://www.duckrowing.com/2010/05/21/using-the-singleton-pattern-in-objective-c/ 호기심에서 벗어난 이유는 무엇입니까? 링크 된 블로그 게시물은 싱글 톤 패턴을 사용하지 않는 것이 좋습니다. –

+0

싱글 톤은 괜찮습니다. 문제는 Apple 샘플 코드가 단일 인스턴스 제약 조건을 적용하는 대신 단일 인스턴스 제약 조건을 적용하여 단일 객체를 구현한다는 것입니다. '+ sharedInstance' 메소드를 갖는 것이 좋습니다. 단일 인스턴스 만 적용하면 거의 유용하지 않습니다. 예를 들어,'NSUserDefaults'는 싱글 톤이지만, 여러분이 별도의 인스턴스를 할당/초기화하는 것을 막지는 않습니다. 'NSFileManager'도 마찬가지입니다. 이것을 제한 할 필요가있는 것은 매우 드문 일이므로 아마 그렇게 할 필요가 없을 것입니다. –

+0

좋아 ... 내가 널 잡은 것 같아. 고마워요! –

관련 문제