iPhone Simulator: ошибки сборки при использовании синтезированных переменных экземпляра - PullRequest
13 голосов
/ 20 июля 2009

Существует две среды выполнения для Cocoa / Objective-C: устаревшая среда исполнения и «современная» среда исполнения (так Apple называет это).

Согласно документации Apple , « приложения для iPhone и 64-разрядные программы в Mac OS X v10.5 и более поздних версиях используют современную версию среды выполнения ».

Пока все хорошо.

Теперь «современная» среда выполнения поддерживает функцию, называемую «синтезированные переменные экземпляра», что означает, что вам не нужно определять переменную экземпляра для каждого объявленного свойства. Переменная экземпляра будет добавлена ​​автоматически. Цитата из Справочной библиотеки iPhone : " Для современных сред выполнения переменные экземпляра синтезируются по мере необходимости. Если переменная экземпляра с таким именем уже существует, она используется. "

Если вы используете эту функцию в своем приложении для iPhone, оно прекрасно работает и работает на iPhone (физическом) устройстве, но при изменении цели на «Симулятор iPhone» вы получаете ошибки сборки:

Синтезированное свойство 'x' должно называться так же, как и совместимый ivar, или должно явно именовать ivar

Что здесь происходит? Разве симулятор iPhone не является настоящим симулятором iPhone? Означает ли это, что симулятор использует другое время выполнения, чем физический iPhone?

Как я могу использовать эту функцию на симуляторе iPhone?

EDIT:

Код, который не компилируется при нацеливании на симулятор iPhone:

@interface MyClass : NSObject {
}

@property NSString *prop1;

@end

Согласно документации, это должно нормально работать в «современной» среде выполнения, и действительно работает на устройстве iPhone, но не компилируется при изменении цели на iPhone Simulator.

Ответы [ 2 ]

15 голосов
/ 20 июля 2009

iPhone Simulator в текущих SDK (3.0) использует среду выполнения хоста, которая не поддерживает синтезированные ивары в 32-битном режиме. Вам придется @synthesize ваших иваров, пока симулятор не будет исправлен. (Было бы хорошо, если бы Apple сообщала об ошибке, запрашивая это улучшение.)

4 голосов
/ 20 июля 2009

Вам нужна переменная для «резервного копирования» синтезированного свойства, если только вы не планируете реализовать свойство самостоятельно.

Самый простой способ исправить ваш код - добавить переменную экземпляра:

@interface MyClass : NSObject {
NSString * prop1;
}

@property NSString *prop1;

@end
...