Сочетание интерфейса между собственностью, частным и расширенным классом - PullRequest
2 голосов
/ 12 ноября 2009

Я скачал образец кода AA-Plot Chart.

Один из файлов .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

1 Ответ

3 голосов
/ 12 ноября 2009

«дополнительные» элементы, которые вы видите в файле .m, относятся к категории . Первоначально программист, вероятно, просто хотел скрыть некоторые детали своей реализации от открытого интерфейса своего класса (в файле .h), поэтому он создал категорию (в данном случае безымянную, поэтому внутри () ничего нет) добавить их в свой файл реализации. В этом конкретном случае он скрывает методы доступа для своих личных переменных, чтобы внешний код не мог их получить.

Изменения, которые вы показываете во втором фрагменте кода, объединяют все в единый интерфейс класса. Эти изменения не должны влиять на работу во время выполнения вообще. (За исключением того, что вы вынули @private, это было специально?) Семантическое различие заключается в том, что методы категории добавляются в класс во время выполнения.

Категории могут добавлять только методы, а не переменные экземпляра, поэтому исходный код имеет все объявления переменных экземпляра (даже те, которые имеют «секретные» методы доступа) в исходном блоке @interface.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...