Комбинированная путаница интерфейса и частного и расширенного класса.
-
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
блокировать.