2012-01-20 3 views
0

나의 수업 중 하나에서 나는 -(id) init 방법을 가지고있다. 이 메서드에서 발생하는 첫 번째 작업은 [super init]슈퍼 init이 작동하지 않는다

모두 호출되었지만 최근에는 새로운 xcode 프로젝트로 상당히 오래된 코드를 가져 왔습니다. 나는이 줄에 오류가 발생합니다 :

오류 : 자동 참조 카운팅 문제를 : 대리인 초기화 호출의 결과는 즉시 반환 또는 '자기'

왜이 오류가 발생하는 할당해야합니까? 이것은 ARC 시스템 하에서 감가 상각 되었기 때문입니까? 또는 다른 것?

+2

오류 메시지를 읽으십시오. 이미 잘못된 점과 문제를 해결하는 방법을 분명히 알려줍니다. – fzwo

+0

@fzwo 제 질문은 이전에도 효과가있었습니다. – SirYakalot

+0

미안하지만, 그건 당신이 요구 한 것이 아닙니다. 왜 지금 일어 났는지 물어 보았습니다 (오류 메시지로 대답). (콩 카운터처럼 보니 유감스럽게 생각하지만, 가능한 한 명확한 문장 질문을 시도하는 것이 중요하고 예의라고 생각합니다. 귀하의 질문에 "나는 실수를 보았습니다. 이미 고쳐졌지만, 나는 그것이 이전에 효과가 있었는지 궁금하다. ") – fzwo

답변

3

이전 시스템으로 어떻게 했습니까? LLVM은 GCC는 이전보다 훨씬 더 엄격하기 때문에 당신은

self = [super init]; 

if (self) ... 

return self; 
+0

옛날 방식은 자신의 길을했지만, 없이는 '자기 ='. 이 모든 일이 정확히 무엇이며 왜 이전에 효과가 있었습니까? – SirYakalot

+0

'self'는'init'에서 생성되는 객체에 대한 포인터입니다. '[super init]'은 수퍼 클래스의 생성자를 호출하고'self = [super init]'는 변수 self가 그것을 가리 키도록 할당합니다. ''self''를 가리 키지 않고'[super init]'라고 쓰면, 체인의 어딘가에 어쨌든'self = [super init]'을 가질 수 있기 때문에 여전히 작동 할 수 있습니다. 그러나 이것을 가정해서는 안됩니다. 나는 그들이 ARC로이 행동을 비추었을 것이라고 생각한다. – vakio

+0

@vakio : "어딘가에서 사슬을 올리면 어쨌든 스스로 = [super init]가됩니다. 이것은 잘못된 대답입니다. 'self'는 지역 변수이고, 다른 메소드의 지역 변수에 대한 할당은 효과가 없습니다. 'self = [super init];이 필요한 이유는'init'이 호출 된 객체와 다른 객체를 반환 할 수 있기 때문입니다 (또는'nil'). 'init'이 호출 된 객체를 항상 리턴했다면 간단히'[super init];만으로 충분할 것입니다. 그것이 여전히 작동하는 이유는'init' 메소드의 99 %가 호출 된 객체를 반환하기 때문입니다. – newacct

1

그것은 당신을 위해 이전에 일을 할 (두 버전에) 기대하고 있습니다. GCC는 오류를 감지하지 못했고 그의 의견에서 @vakio가 지적했듯이, 체인 어딘가에있는 self = [super init]이 있기 때문에 작동했다. LLVM은 컴파일하는 동안이 오류를 감지하여 잘못된 코드를 컴파일하지 못하게합니다.

0

이것은 내게 잘 맞았습니다 :

은 자기 자신에게 어떤 것을 할당해야합니다.

-(id) init { 
    self = [super init]; 
    return self; 
} 
관련 문제