2010-12-22 2 views
2

나는 현재의 수업에서 어떤 것을 언급하면서 자기의 사용을 이해한다고 생각했다. 이 경고 및 후속 실행 실패가 발생하면, 나는 "자기 정의"또는 "자기 사용법"의 많은 변종을 봤는데 아무데도 못 찾았 어. 이 문제는 경고없이 개체를 만들고 그 이유를 이해하는 방법입니다. 내가 self에 대한 Foo를 대체 할 경우자기를 사용하여 객체를 만드는 방법은 무엇입니까?

#import <Cocoa/Cocoa.h> 

@interface Foo : NSObject { 
    Foo *obj; 
} 
-(void)beta; 
@end 

#import "Foo.h" 
@implementation Foo 
    -(void)beta{ 
    obj = [self new];  // 'Foo' may not respond to '-new' 
} 
@end  

참고, 아무 문제가 없습니다. 나는 클래스 이름과 자기가 동등하다고 생각했지만 컴파일러는 그렇게 생각하지 않는다.

  1. 아마도 단지 내 문제를 해결할뿐만 아니라 self의 사용에 대한 이해를 계몽되지 않습니다 여기에 무엇이 잘못되었는지에 대한 설명.

  2. 자아의 올바른 사용법에 대한 자습서가 있습니까? "self은 메시지의 수신자입니다."라는 말을 넘어선 아무것도 찾을 수 없었습니다. 전혀 도움이되지 못했습니다.

답변

7

self 참조 메시지의 수신자,이 특정한 경우에 그래서, self 참조 -beta 호출의 대상이되는 객체. new 인스턴스 없기 때문에 방법에 호출하는 개체를 참조이 경우 self 이후 지금

, 컴파일러는 당신에게 경고를 제공 (클래스 메소드의 범위 내에서, self 클래스 'Class 객체 참조) 방법은 Foo입니다. new클래스 메서드NSObject에서 상속됩니다. 그래서,이 작업을 수행하는 올바른 방법은, self에서 Class 개체를 검색하는에 new를 호출하는 것입니다 :

- (void) beta { 
    obj = [[self class] new]; 
} 
+1

+1 좋은 설명 –

+0

이 잘 작동합니다. + 새로운 [자아 수업]이 걸립니다. 그런 다음 자기 나 obj를 사용하여 -method를 호출 할 수 있습니다. [여기에 CR을 쓰지 않을 것입니다. 죄송합니다] - (void) beta { // Foo * obj; in .h \t // obj = [self new]; 여기에서 실패 - 경고, 실행 실패 obj = [[self class] new]; \t [obj 알파]; // [self alpha]도 여기서 작동합니다. } - (void) alpha { \t NSLog (@ "alpha"); \t return; } – Nick

+0

@ 닉, 질문에 충분히 답변 한 경우 내 대답 왼쪽의 빈 체크 표시를 클릭하여 동의하십시오. –

관련 문제