2010-03-04 6 views
3

Cela pourrait être spécifique à l'iPhone, je ne suis pas sûr. Le compilateur ne se plaint pas lors de la construction pour le simulateur mais lors de la compilation pour le périphérique, il lance des erreurs funky lorsque j'essaie de définir des propriétés pour les références aux objets. Par exemple,Objective-C, propriétés pour les références

@property (nonatomic) CGRect &finalFrame; 

et le synthétiseur coressponding

@synthesize finalFrame; 

pour une variable déclarée comme

CGRect finalFrame; 

donne les erreurs

  • type de propriété 'finalFrame' ne correspond pas type d'ivar 'finalFrame'
  • non reconnaissable insn:
  • erreur du compilateur interne: Erreur de bus
  • erreur du compilateur interne: en extract_insn, à recog.c: 2904

Cependant, je peux le faire manuellement sans problème, avec les méthodes suivantes :

- (CGRect&)finalFrame; 
- (void)setFinalFrame:(CGRect&)aFrame; 

Est-ce un bug de gcc? Il compile pour le simulateur.

+1

Ce code ne peut pas être compilé car '&' n'est pas un déclarateur en Objective-C (en d'autres termes, il ne peut pas être utilisé dans le cadre de la déclaration d'une variable). Vouliez-vous écrire un astérisque aux endroits où vous avez les caractères d'esperluette dans votre code d'exemple? – jlehr

+0

En utilisant Obj-C++, devrait avoir explicitement déclaré que, désolé – Sam

Répondre

5

Votre propriété est déclarée en tant que type de référence (CGRect&) mais votre variable d'instance n'est pas un type de référence (CGRect). Ils doivent être les mêmes pour utiliser @synthesize.

Il est également un peu étrange d'utiliser des types de référence C++ comme propriétés Objective-C, mais je suppose que cela pourrait fonctionner tant que tous les fichiers sont compilés en Objective-C++.

+0

Il me semble étrange qu'il compile et fonctionne sur le simulateur. Toute la documentation que j'ai lue indique que l'appariement propriété/synthétiser est supposé être juste un raccourci par rapport à ce que j'ai déclaré manuellement (ce qui a fonctionné). Je comprends que la variable n'est pas déclarée comme CGRect & mais bien sûr il ne devrait pas être. Est-ce étrange? Je ne vois rien de mal à utiliser une référence. J'aurais dû préciser que j'utilise Obj-C++ – Sam

+0

Je veux dire que je comprends que la propriété attend le même type de données que la variable, mais c'est sûrement un bug dans le mécanisme s'il ne peut pas faire face à des références? Il me manque peut-être une compréhension fondamentale des propriétés, parce que j'ai toujours pensé qu'elles étaient essentiellement prétraitées dans des méthodes telles que celles que j'avais publiées. – Sam

+1

@Sam: Dire qu'il est prétraité dans les méthodes n'est pas correct. La directive '@ synthesize' provoque la génération de méthodes, mais ce n'est pas un remplacement de texte stupide comme une macro de préprocesseur. Le compilateur doit faire correspondre les types afin de générer la méthode appropriée, et apparemment il ne comprend pas suffisamment les références pour générer la méthode appropriée liant une référence à un type de données normal. Je suppose que vous pourriez appeler ça un bug, mais en fait c'est juste quelque chose qui n'est pas supporté. – Chuck

Questions connexes