Вот моя ситуация, я объявляю класс objective-c, как показано ниже:
@interface FileItem : NSObject
@property (nonatomic, strong, readonly) NSString *path;
@property (nonatomic, strong, readonly) NSArray* childItems;
- (id)initWithPath:(NSString*)path;
@end
@implementation LCDFileItem
- (id)initWithPath:(NSString*)path {
self = [super init];
if (self) {
_path = path;
}
return self;
}
- (NSArray*)childItems {
if (!_childItems) { // error, _childItems undeclared!
NSError *error;
NSMutableArray *items = [[NSMutableArray alloc] init];
_childItems = items; // error, _childItems undeclared!
}
return _childItems; // error, _childItems undeclared!
}
Я помечаю "path" и "childItems" как свойство "только для чтения", компилятор жалуется, что идентификатор "_childItems" не объявлен, кажется, что я не могу использовать "- (NSArray *) childItem" в качестве функции получения свойства "childItem" (Имя функции меняю, все идет нормально) почему? Я понимаю, что атрибут "только для чтения" заставляет xcode опускать функцию установки свойства, но каков эффект для функции получения?
2 ответа
Из документации Apple: «Если вы реализуете и геттер, и сеттер для свойства readwrite, или геттер для свойства только для чтения , компилятор предположит, что вы берете на себя управление реализацией свойства и выиграете» t автоматически синтезировать переменную экземпляра. "
Распространенным подходом является размещение свойства «только для чтения» в заголовке и дублирования определения свойства внутри расширения класса без атрибута «только для чтения».
Xcode жалуется, потому что проблема с вашим кодом заключается в том, что свойство не синтезируется автоматически если вы реализуете все необходимые методы доступа, которые для вашего свойства только для чтения будут просто реализовывать геттер .
Добавьте следующее после @implementation:
@synthesize childItems = _childItems;
И ошибка должна уйти ...
Похожие вопросы
Новые вопросы
objective-c
Этот тег следует использовать только для вопросов, касающихся функций Objective-C или зависящих от кода на языке. Теги [cocoa] и [cocoa-touch] следует использовать, чтобы узнать о фреймворках или классах Apple. Используйте связанные теги [ios], [macos], [apple-watch] и [tvos] для проблем, характерных для этих платформ.