속성 및 개인 및 확장 클래스 조합 인터페이스의 혼동
-
19-09-2019 - |
문제
AA-Plot 차트의 샘플 코드를 다운로드했습니다.
.h 파일 중 하나 :
@interface MainViewController : UIViewController <APYahooDataPullerDelegate, CPPlotDataSource> {
CPLayerHostingView *layerHost;
@private
APYahooDataPuller *datapuller;
CPXYGraph *graph;
}
@property (nonatomic, retain) IBOutlet CPLayerHostingView *layerHost;
@end
.M 파일에서 인터페이스가 다시 선언됩니까?
@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
해결책
.m 파일에서보고있는 "추가"물건은 범주. 원래 프로그래머는 아마도 그의 클래스의 공개 인터페이스 (.H 파일)에서 구현 세부 정보를 숨기고 싶었을 것입니다. ()
) 그의 구현 파일에 추가합니다. 이 특정한 경우, 그는 외부 코드가 얻을 수 없도록 개인 변수에 대한 액세서를 숨기고 있습니다.
두 번째 코드 스 니펫에 표시된 변경 사항은 모든 것을 단일 클래스 인터페이스에 넣습니다. 이러한 변경 사항은 런타임 작동에 전혀 영향을 미치지 않아야합니다. (당신이 꺼내는 것을 제외하고 @private
, 의미 론적 차이는 범주 메소드가 런타임에 클래스에 추가된다는 것입니다.
카테고리는 인스턴스 변수가 아닌 메소드 만 추가 할 수 있으므로 원래 코드는 원본에 모든 인스턴스 변수 선언 ( '비밀 액세서가있는 사람조차도)이있는 이유입니다. @interface
차단하다.
제휴하지 않습니다 StackOverflow