2016-09-01 3 views
7

를 서브 클래 싱 나는앞으로 선언

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) MyClassB *myClassB; 

@end 

MyClassB 속성 myString을 가지고 유형 MyClassB의 속성이 MyClassA 있습니다.

// 
// MyClassB.h 
// 

@interface MyClassB : NSObject 

@property (copy, nonatomic, readonly) NSString *myString; 

@end 

나는 그것이 구현의에서 myString에 액세스해야 MyClassC 있습니다.

내가해야 -

A) 앞으로 일반적으로 MyClassA.h

답변

2

MyClassC.m

또는

B) #import MyClassB.hMyClassA.h에서 MyClassB#import "MyClassB.h"를 선언, 당신은으로 선언 전달한다 가능하면 헤더 파일에 @class을 입력하십시오. 컴파일러가 그 클래스 나 프로토콜에서 무슨 일이 일어나는지 알 필요가 있기 때문에 당신이 슈퍼 클래스에서 상속하거나 프로토콜 준수를 선언 할 때 당신이 아마 그렇게하고 싶지 않을 때가 있습니다.

이 경우, 헤더 파일의 모든 속성 선언에 @class를 사용하고 MyClassC.m 파일에 #import MyClassB.h을 사용합니다. 그러면 MyClassC는 MyClassB의 모든 속성을 알 수 있습니다.

2

조금 다른 각도에서 보면 ... 세계가 실제로 myClassB에 대해 알고 싶은지를 결정해야합니다. MyClassA입니다. 예를 들어, MyClassA을 통해 얻을 수있는 myString을 광고하려는 경우에만 가능합니다. 이렇게하면 다른 클래스가 기본 구현 인 myString을 알 수 없게됩니다. MyClassB을 노출 할 필요가 없다면 "나머지 세계"에서 숨길 수 있습니다. 다음과 같이 MyClassA.h 바꿀 것이 경우

: MyClassA.m에서

// 
// MyClassA.h 
// 

@interface MyClassA : NSObject 

@property (strong, nonatomic, readonly) NSString *myString; 

@end 

, 당신은 다음을 수행합니다.

// 
// MyClassA.m 
// 

#import "MyClassA.h" 
#import "MyClassB.h" 

@interface MyClassA() 

@property (strong, nonatomic) MyClassB *myClassB;; 

@end 

@implementation MyClassA 

// Other meaningful code omitted 

- (NSString *)myString { 
    return self.myClassB.myString; 
} 

@end 

내가 여기했던 것은 내부적으로 myClassB에 대한 속성을 정의에 익명의 범주를 사용하는 것을 참고.

여기서 핵심은 MyClassB을 다른 사람에게 노출시키지 않는지 여부입니다. 이 접근법의 가장 큰 장점은 코드가 가단성이 있다는 것입니다. myString이 다른 방식으로 파생되었다고 가정 해 보겠습니다. 다른 수업이나 다른 방법에서 온 것입니다. myString을 소비해야하는 코드는 예방 접종을받습니다. 당신이 MyClassB을 노출해야하는 경우 위 또는 MyClassA.h에서 #import MyClassB.h 타일러 권장

, 당신은 @class을 사용할 수 있습니다. 우수 사례는 앞으로 선언하는 @class을 처방합니다. 그러나 때로는 구현 파일 내에서 많은 파일을 가져 오는 것을 기억하지 않아도되므로 편리 할 수 ​​있습니다. 그것은 당신의 코드 기반이므로 어떤 것이 가장 적합한 지 선택할 수 있습니다. 나는 일반적으로이 둘의 조합을 사용한다.