2009-07-20 2 views
13

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

Согласно Apple's documentation, «Приложения для iPhone и 64-разрядные программы на Mac OS X версии 10.5 и более поздние версии используют современную версию времени выполнения».

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

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

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

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

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

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

EDIT:

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

@interface MyClass : NSObject { 
} 

@property NSString *prop1; 

@end 

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

ответ

15

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

+2

Это правильно - это ошибка в текущем тренажере. В этом была тема SO (что я не могу найти - возможно, это был поток какао-dev), а также это: http://iphonedevelopment.blogspot.com/2009/06/runtime-madness.html –

+0

@ Даниэль: этот комментарий стоит пересчитать как ответ –

+1

Я считаю, что это было исправлено в 4.0 или 4.1 SDK. –

4

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

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

@interface MyClass : NSObject { 
NSString * prop1; 
} 

@property NSString *prop1; 

@end 
+1

Я знаю это, но на самом деле это не ответ на мой вопрос. Он не объясняет, почему функция, работающая на устройстве iPhone, не работает в симуляторе. Не нужно «резервное копировать» свойство является особенностью «современной» среды исполнения, поддерживаемой iPhone. –

+0

Я обнаружил, что я -don't-на самом деле должен определить переменную экземпляра базы данных после определения свойства, и приложение работает нормально. Что это за история? Требуется ли переменная экземпляра или нет? –

+0

, который исправил мою проблему! благодаря :) – ExceptionSlayer