2009-07-20 4 views
13

Il existe deux temps d'exécution pour Cocoa/Objective-C: le runtime hérité et le runtime "moderne" (c'est ce que Apple appelle).iPhone Simulator: génération d'erreurs lors de l'utilisation de variables d'instance synthétisées

Selon Apple's documentation, "applications iPhone et les programmes 64 bits sur Mac OS X 10.5 et versions ultérieures utilisent la version moderne de l'exécution".

Jusqu'ici tout va bien. Maintenant, l'exécution "moderne" prend en charge une fonctionnalité appelée "variables d'instance synthétisées", ce qui signifie que vous n'avez pas besoin de définir une variable d'instance pour chaque propriété déclarée. La variable d'instance sera ajoutée automatiquement. Citation du iPhone Reference Library: «. Pour les runtimes modernes, les variables d'instance sont synthétisés au besoin Si une variable d'instance du même nom existe déjà, il est utilisé »

Si vous utilisez cette fonction dans votre application iPhone, il se construit et fonctionne bien sur l'iPhone (physique), mais lorsque vous changez de cible pour "iPhone Simulator", vous obtenez des erreurs de compilation:

La propriété synthétisée 'x' doit être nommée de la même manière qu'une ivar compatible ou doit nommer explicitement un ivar

Que se passe-t-il ici? Le simulateur d'iPhone n'est-il pas un vrai simulateur d'iPhone? Cela signifie-t-il que le simulateur utilise une durée d'exécution différente de celle de l'iPhone physique? Comment puis-je utiliser cette fonctionnalité sur le simulateur iPhone?

EDIT:

Le code qui ne compile pas lors du ciblage de l'iPhone Simulator est:

@interface MyClass : NSObject { 
} 

@property NSString *prop1; 

@end 

Selon la documentation, cela fonctionne bien sur le moteur d'exécution "moderne" , et en effet il le fait sur l'appareil iPhone, mais il ne compile pas lors du changement de la cible pour iPhone Simulator.

Répondre

15

Le simulateur iPhone des SDK actuels (3.0) utilise le moteur d'exécution de l'hôte, qui ne prend pas en charge les ivars synthétisés en mode 32 bits. Vous devrez @synthesize vos ivars jusqu'à ce que le simulateur soit réparé. (Il serait bon de déposer un bogue avec Apple demandant cette amélioration.)

+2

Ceci est correct - c'est un bug dans le simulateur en cours. Il y avait un sujet de SO à ce sujet (que je ne peux pas trouver - peut-être c'était un fil de cacao-dev), et aussi ceci: http://iphonedevelopment.blogspot.com/2009/06/runtime-madness.html –

+0

@ Daniel: ce commentaire vaut le reposter comme réponse –

+1

Je crois que cela a été corrigé dans le SDK 4.0 ou 4.1. –

4

Vous devez avoir une variable pour 'sauvegarder' la propriété synthétisée, sauf si vous envisagez d'implémenter la propriété vous-même.

La façon la plus simple de fixer votre code est d'ajouter une variable d'instance:

@interface MyClass : NSObject { 
NSString * prop1; 
} 

@property NSString *prop1; 

@end 
+1

Je le sais, mais ce n'est pas vraiment une réponse à ma question. Cela n'explique pas pourquoi une fonctionnalité qui fonctionne sur le périphérique iPhone ne fonctionne pas dans le simulateur. Ne pas avoir à "sauvegarder" la propriété est une caractéristique de l'exécution "moderne", soutenue par l'iPhone. –

+0

Je trouve que je n'ai pas besoin de définir la variable d'instance de sauvegarde après avoir défini la propriété, et l'application fonctionne correctement. Quelle est l'histoire ici? La variable d'instance est-elle nécessaire ou non? –

+0

qui a résolu mon problème! Merci :) – ExceptionSlayer