Для 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.