Итак, у меня есть протокол, который требует объявления свойства:
@protocol MyProtocol <NSObject>
@property MyView *myView;
@end
и объект, который ему соответствует:
@interface MyViewController : NSViewController <MyProtocol>
@end
Однако, если я объявлю свойство (указанное в протоколе) внутри файла реализации (расширение класса):
@interface MyViewController()
@property MyView *myView;
@end
Я получаю такую ошибку:
Незаконное повторное объявление свойства в расширении класса MyViewController (атрибут должен иметь значение readwrite, а его основное значение должно быть только для чтения)
Кажется, есть два основных потока SO, которые обращаются к этому:
атрибут должен быть доступен для чтения и записи, а его основной должен быть доступен только для чтения
и
Невозможно объявить другое окно
Первый ответ ничего не объясняет
Во втором ответе говорится, что эту ошибку можно обойти, объявив свойство внутри заголовка; и увы
Заголовок
@interface MyViewController : NSViewController <MyProtocol>
@property MyView *myView;
@end
Реализация
@interface MyViewController()
@end
Это строится без ошибок.
Я также знаю, что когда вы объявляете @property
внутри протокола, он не синтезируется автоматически.
Поэтому, если бы я хотел сохранить объявление @property
внутри реализации, мне пришлось бы @synthesize
его. И это тоже работает.
Итак, мой вопрос: почему объявление @property
внутри заголовка по сравнению с файлом реализации имеет значение, если @property
изначально был объявлен внутри протокола?
Я думал, что без протокола единственная разница в том, чтобы сделать @property
общедоступным или частным. Но очевидно, что есть и другие вещи, которые случаются / не происходят, если вы объявляете @property
в заголовке по сравнению с файлом реализации.
MyViewController
соответствует _2 _--, и похоже, что никто не знает, что это так, если я соглашаюсь с расширением класса - person A O   schedule 28.09.2015@property
внутри заголовка или реализации, и почему, если я объявляю@property
какreadwrite
в протоколе, но какreadonly
в реализации - - оно работает - person A O   schedule 28.09.2015@property
. У меня есть методы, объявленные в моем протоколе, и компилятор полностью согласен со мной, реализуя их без объявления в заголовке. Также я не понимаю, почему он волшебным образом работает, когда я добавляю свойстваreadwrite
иreadonly
- person A O   schedule 28.09.2015