Собственность отказывается синтезировать - PullRequest
0 голосов
/ 02 декабря 2009

Я просматривал скринкасты здесь , чтобы узнать, как написать приложение для iPhone на основе таблицы, и пока все идет довольно гладко. В настоящее время я на полпути к третьему эпизоду, и это начинает поражать.

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

У меня проблема в том, что переменная для массива отказывается синтезировать.

Переменная-нарушитель определена в файле AppDelegate.h с остальными свойствами следующим образом:

@property (readonly) NSArray *recipes;

Затем он синтезируется и реализуется в файле AppDelegate.m следующим образом:

@synthesize recipes;

- (NSArray *)recipes {
    return [data allKeys];
}

Я спросил у автора скринкаста, и он предложил следующее для AppDelegate.h:

@class Foo :NSObject {
    NSArray *_recipes;
}

@property(nonatomic, retain)NSArray *recipes;

@end

А это для AppDelegate.m:

@implementation Foo

@synthesize recipes = _recipes;

@end

Я попробовал этот метод, но он создал больше ошибок, чем было раньше. Что отличает это определение переменной от любого другого @property и как я могу заставить его вести себя?

Ответы [ 2 ]

11 голосов
/ 02 декабря 2009

@property является «просто» сокращением для объявлений методов. @dynamic означает, что вы будете динамически предоставлять реализации во время выполнения, что является нетипичным шаблоном расширенного использования.

Таким образом:

@property (readonly) NSArray *recipes;

В заголовке есть сокращение от:

- (NSArray *) recipes;

@synthesize recipes; синтезирует методы, подразумеваемые объявлением @property. Не больше, не меньше. Поскольку кто-то упомянул об этом, @synthesize recipes=_recipes; будет синтезировать методы, но для хранения будет использоваться переменная экземпляра _recipes (а не recipes).

Если вы реализуете свой собственный метод получения (поскольку он доступен только для чтения, есть только метод получения), в форме:

- (NSArray *) recipes {
    return ....;
}

Тогда нет необходимости ни @synthesize, ни @dynamic.

2 голосов
/ 02 декабря 2009

@synthesize генерирует простой метод для доступа к свойству. Поскольку ваш метод доступа является более сложным, он не может быть создан с помощью @synthesize.

- (NSArray *)recipes {
    return [data allKeys];
}
...