Комбинированная путаница интерфейса и частного и расширенного класса.

StackOverflow https://stackoverflow.com/questions/1718673

Вопрос

Я загрузил образец кода диаграммы 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 блокировать.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top