2014-11-23 2 views
0
@interface hello:SKScene 
@end 

@implementation hello 

+(void)method{ 

    [self here]; 

} 
@end 

main.m자기 개념,

[hello method]; 
여기

, 누구에 속하는 ???? 내 질문은 자기가 다음에 개체를 정의하지 않았기 때문에 다음에 호출하는 메서드를 포함하는 클래스에 속합니다. 왜이 개체에 여전히 자체를 사용할 수 있습니까 ?????

여전히 클래스에 속해 있습니까? 인스턴스 메서드 및 클래스 메서드에서 나에게 적절한 개념을 알려주세요.

답변

2

self 클래스 메서드를 참조 할 때 self은 해당 클래스의 특정 인스턴스가 아니라 클래스 자체를 참조합니다. 이러한 클래스 메서드에서 실제 클래스 이름이 아닌 self을 사용하면 문제가되는 클래스를 쉽게 서브 클래 싱 할 수 있습니다. 특히 클래스 메서드는 상속되지만 self 참조는 이제 기본 클래스가 아닌 하위 클래스를 참조합니다. 이름으로 기본 클래스를 참조하면 이는 사실이 아닙니다.

이 팩토리 메소드 고려 :

@implementation BaseClassObject 

// THIS IS WRONG 

+ (BaseClassObject *)object { 
    return [[BaseClassObject alloc] init]; 
} 

@end 

을 그리고이 서브 클래스 고려 : 문제는 그 object 팩토리 메소드 것입니다

SubClassObject *object = [SubClassObject object]; // WRONG 

을 :

@interface SubClassObject : BaseClassObject 
@end 

그런 다음 수행하는 코드를 고려를가 아닌 BaseClassObject을 반환하십시오.3210. 내가 [SubClassObject object]를 참조 할 때

@implementation BaseClassObject 

// THIS IS RIGHT 

+ (instancetype)object { 
    return [[self alloc] init]; 
} 

@end 

지금, 나는 SubClassObject보다는 BaseClassObject의 인스턴스를 얻을 것이다 : 우리가 팩토리 클래스 메소드의 정의는 self을 사용하여 변경하는 경우 그러나 그것은 해결할된다.


참고 : 내 인위적인 예, 그것은 self을 사용하는 것이 오히려 중요합니다. 그래도 바로 관련성이없는 코드가있을 수 있습니다 (예 : 기본 클래스가 있지만 현재로서는 하위 클래스가 없을 수 있음).

심지어이 경우에도 "future-proof"코드에 관계없이이 클래스 메서드에서는 self을 사용하는 습관이 있어야합니다. 따라서 예상치 못한 날짜에이 기본 클래스를 하위 클래스로 서브 클래 싱하는 경우 앞으로 이러한 클래스 메서드는 서브 클래 싱 된 경우에도 제대로 작동 할 가능성이 높습니다.

+0

마지막 예제에서 "this is right"와 완전히 동의 할 수 없습니다. http://stackoverflow.com/a/26821507/2792531 – nhgrif

+0

나는 실제적인 추가 구성이 init 메소드에 들어가는 것이 좋습니다. 팩토리 메서드는 그 결과를 반환합니다. – nhgrif

+1

팩토리 메소드에 무엇이 들어가고'init'으로 들어가는 지에 대한 논의는 여기서는별로 관련이 없지만 여러분을 위해 그 주석을 제거했습니다. – Rob

0

Rob의 답변에 조금 더 추가하면 클래스 개체가 컴파일러 및/또는 Objective-C 런타임에 의해 자동으로 만들어집니다. (그것은 당신에게 중요하지 않습니다.) 모든 의도와 목적을 위해, 그것은 영구적입니다. 관리 할 필요가 없습니다.