IPhone Simulator: создавать ошибки при использовании синтезированных переменных экземпляра
Для Cocoa/Objective-C существует два режима времени выполнения: устаревшая среда выполнения и "современная" среда выполнения (это то, что Apple называет).
Согласно документации Apple, "приложения iPhone и 64-разрядные программы в Mac OS X версии 10.5 и более поздних версий используют современную версию во время выполнения".
Пока все хорошо.
Теперь "современная" среда исполнения поддерживает функцию "синтезированные переменные экземпляра", а это означает, что вам не нужно определять переменную экземпляра для каждого объявленного свойства. Переменная экземпляра будет добавлена автоматически. Цитата из Справочная библиотека iPhone: "Для современных сред выполнения переменные экземпляра синтезируются по мере необходимости. Если переменная экземпляра с тем же именем уже существует, он используется."
Если вы используете эту функцию в своем приложении для iPhone, она строит и работает нормально на iPhone (физическом) устройстве, но когда вы меняете цель на "iPhone Simulator", вы получаете ошибки сборки:
синтезированное свойство "x" должно либо называться так же, как совместимый ivar, либо должно явно указывать имя ivar
Что здесь происходит? Разве симулятор iPhone не настоящий симулятор iPhone? Означает ли это, что симулятор использует другое время выполнения, чем физический iPhone?
Как я могу использовать эту функцию на симуляторе iPhone?
EDIT:
Код, который не компилируется при таргетинге на iPhone Simulator:
@interface MyClass : NSObject {
}
@property NSString *prop1;
@end
В соответствии с документацией это должно отлично работать в "современной" среде исполнения, и действительно, это происходит на устройстве iPhone, но оно не скомпилируется при изменении цели на iPhone Simulator.
Ответы
Ответ 1
Симулятор iPhone в текущих SDK (3.0) использует время выполнения хостов, которое не поддерживает синтезированные ивары в 32-битном режиме. У вас будет @synthesize
ваши яйца до тех пор, пока симулятор не будет исправлен. (Itd хорошо зарегистрировать ошибку с Apple, требуя этого улучшения.)
Ответ 2
Вам нужно иметь переменную для "резервного копирования" синтезируемого свойства, если вы не планируете самостоятельно реализовать это свойство.
Самый простой способ исправить ваш код - добавить переменную экземпляра:
@interface MyClass : NSObject {
NSString * prop1;
}
@property NSString *prop1;
@end