2009-11-11 2 views
2

AA- 플롯 차트의 샘플 코드를 다운로드했습니다. .H 파일의인터페이스의 속성 및 개인 및 확장 된 클래스 조합의 혼동

하나 : 인터페이스가 다시 선언 된하는 .m 파일에서

@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> { 
    CPLayerHostingView *layerHost; 
@private 
    APYahooDataPuller *datapuller; 
    CPXYGraph *graph; 
}  
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost; 
@end 

?

@interface MainViewController() 

@property(nonatomic, retain) CPXYGraph *graph; 
@property(nonatomic, retain) APYahooDataPuller *datapuller; 

@end 

위의 코드는 샘플 프로젝트의 기본보기 컨트롤러 코드에서 발견되었습니다.

내가 다음을 수행하면 위 코드와 아래 코드의 차이점은 무엇입니까?

@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> { 
    CPLayerHostingView *layerHost; 
    APYahooDataPuller *datapuller; 
    CPXYGraph *graph; 
}  
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost; 
@property(nonatomic, retain) CPXYGraph *graph; 
@property(nonatomic, retain) APYahooDataPuller *datapuller; 
@end 

답변

3

.m 파일에 표시되는 "추가"내용은 category입니다. 원래 프로그래머는 자신의 구현 정보를 .h 파일의 공용 인터페이스에서 숨기려고 했으므로 (이 경우 이름이 없으므로 () 안에 아무 것도없는) 카테고리를 추가하여 자신의 구현 파일에 있습니다. 이 특정 경우에는 외부 변수를 얻을 수 없도록 private 변수에 접근자를 숨기고 있습니다.

두 번째 코드 스 니펫에 표시되는 변경 사항은 모든 것을 단일 클래스 인터페이스에 넣습니다. 이러한 변경 사항은 런타임 작동에 전혀 영향을주지 않습니다. (당신이 @private을 꺼낸 것을 제외하고는, 의도적으로 그런 것입니까?) 의미 상의 차이는 런타임에 클래스에 클래스 메소드가 추가된다는 것입니다.

카테고리는 인스턴스 변수가 아닌 메소드 만 추가 할 수 있습니다. 원래의 코드는 원본 @interface 블록에 인스턴스 변수 선언 ('secret'접근자가 포함 된 경우 포함)이 모두있는 이유입니다.

+0

나는 비밀스런 카테고리를 통해 귀하의 아이디어를 좋아합니다. –

+0

+1 이것은 코코아 프로그래밍에서 매우 일반적인 패턴입니다. 앞에서 말했듯이 내부 클래스는 클래스 사용자의 접근자를 숨기는 데 사용됩니다. –

+0

()는 실제로 클래스 확장이 아닌 클래스 확장입니다. 구문은 범주 구문과 비슷하지만 다른 출력을 생성합니다. –

관련 문제