2012-09-20 2 views
1

이 대 종류는 ... 내 클래스 중 하나 내 구현 파일에있는 것입니다 이 카테고리가 작동하는 이유는 무엇입니까? 클래스 확장

이 코드와 1

@interface MyViewController (PrivateMethods) 
- (NSString *)myPrivateMethod; 
@end 

@implementation MyViewController 
- (void)viewDidLoad 
{ 
    NSString *myString = [self myPrivateMethod]; 
    NSLog(@"%@", myString); 
} 

- (NSString *)myPrivateMethod 
{ 
    return @"someString"; 
} 
@end 

코드 설정 번호, 모든 작동하고 "someString를 기록 ".

내 코드가 어떻게 든 다르게 보일 까? 실제로 실수로 해당 카테고리를 사용하고 있습니다 (복사/붙여 넣기를하고 "PrivateMethods"가 있음을 알지 못했지만 클래스 확장을 사용하려고했습니다).

코드 설정 # 2

@interface MyViewController() 
- (NSString *)myPrivateMethod; 
@end 

@implementation MyViewController 
.... 

또는 :

내 코드는 실제로 다음 중 하나를 같이하지 않겠

코드 설정 # 3

@interface MyViewController (PrivateMethods) 
- (NSString *)myPrivateMethod; 
@end 

@implementation MyViewController (PrivateMethods) 
.... 

무엇 이 상황에서 무슨 일이 일어나고 있는지에 대한 뉘앙스가 무엇입니까? 코드 설정 # 1과 코드 설정 # 2의 차이점은 무엇입니까?

편집 :이 달성처럼 설정 무엇을 설정 # 3

에 대한 질문? 심지어 이것이 "효과가 있습니까"?

@interface MyViewController (PrivateMethods) 
- (NSString *)myPrivateMethod; 
@end 

@implementation MyViewController 
- (void)viewDidLoad 
{ 
    NSString *myString = [self myPrivateMethod]; 
    NSLog(@"%@", myString); 
} 
@end 

@implementation MyViewController (PrivateMethods) 
- (NSString *)myPrivateMethod 
{ 
    return @"someString"; 
} 
@end 

답변

2

런타임에는 선택기가 동일한 평면 네임 스페이스로 푸시됩니다. 컴파일러는 선택자가 범주 (메시징시)에 정의 된 메소드인지 구분하기위한 추가 코드를 추가하지 않습니다. 모두 평평합니다.

카테고리의 기호는 다르게 내보내지만 실제로로드 된 런타임에는 문제가되지 않습니다.

일반적으로 설정 # 3을 사용해야합니다. 범주에서 메서드가 선언 된 경우 범주의 @implementation에 정의해야합니다. 컴파일러는 당신을 때때로 구원 할 것이고 그것은 더 순수한 구조입니다. (물론 모든 메소드가 카테고리에 속한 것은 아닙니다). 마찬가지로, @interface의 선언은 해당 @implementation에 정의되어야하고, 클래스 계속 (@interface MONClass())의 선언의 정의가 또한 프라이 @implementation에 나타납니다 :

질문 업데이트

@implementation MONClass 
// add your @interface MONClass definitions here 
// also add your @interface MONClass() definitions here 
@end 

예 , 그것은 잘 작동합니다. 해야 할 일은 @interface MyViewController (PrivateMethods)을 포함하는 헤더 #import입니다. 실제로 일부 수업에서는 주제별로 분류/정리하기 위해이 작업을 수행합니다.

일반적으로 "개인 메서드"는 클래스 연속에서 선언되지만 반드시 수행 할 필요는 없습니다 (ivars/properties OTOH ...).

+0

설치 # 3에 대한 다른 질문으로 내 질문을 업데이트합니다. 지금까지 고마워! – MikeS

+2

이 경우에 (최근의) Clang은 달리 선언되지 않은 메소드의 정의를 동일한 '@ 구현'에 대한 선언으로 간주한다는 점 또한 중요하다고 생각합니다. –

+0

나는 조쉬를 "잘 알고있다". 그래도 새로운 Xcode를 사용하고 있든 없습니까? – MikeS