Вот моя ситуация, я объявляю класс 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 опускать функцию установки свойства, но каков эффект для функции получения?

0
Qing 5 Фев 2015 в 16:57

2 ответа

Лучший ответ

Из документации Apple: «Если вы реализуете и геттер, и сеттер для свойства readwrite, или геттер для свойства только для чтения , компилятор предположит, что вы берете на себя управление реализацией свойства и выиграете» t автоматически синтезировать переменную экземпляра. "

Распространенным подходом является размещение свойства «только для чтения» в заголовке и дублирования определения свойства внутри расширения класса без атрибута «только для чтения».

2
Phillip Mills 5 Фев 2015 в 14:07

Xcode жалуется, потому что проблема с вашим кодом заключается в том, что свойство не синтезируется автоматически если вы реализуете все необходимые методы доступа, которые для вашего свойства только для чтения будут просто реализовывать геттер .

Добавьте следующее после @implementation:

@synthesize childItems = _childItems;

И ошибка должна уйти ...

1
David Silverfarmer 5 Фев 2015 в 14:06