11 votes

Déclaration de propriété et allocation automatique de stockage de secours

J'essaie de comprendre les propriétés Objective-C et j'ai quelques questions persistantes sur leur syntaxe.

Quelle est la différence entre déclarer explicitement un ivar pour une propriété comme celle-ci :

@interface myObject1 : NSObject {
  NSString *title;
}
@property (copy) NSString *title;
@end

et ceci :

@interface myObject2 : NSObject {
}
@property (copy) NSString *title;
@end

L'exemple de myObject2 semble fonctionner. Est-il possible d'implémenter des propriétés comme dans monObjet2 ou l'ivar associé doit-il toujours être défini explicitement ?

Quelles sont les conséquences de ne pas déclarer explicitement l'ivar ?

13voto

Louis Gerbarg Points 33025

Sur le runtime Objective C moderne (nonfragile-abi), ils sont identiques, le backing ivar sera créé automatiquement par la déclaration @synthesize. C'est le runtime utilisé par l'iPhone et les applications Mac OS X 64 bits. Mac OS X 32 bits utilise le runtime legacy, où il n'est pas possible de synthétiser l'ivar, et le deuxième bout de code que vous avez écrit ne compilerait pas correctement.

Les versions les plus récentes du simulateur d'iPhone utilisent le runtime moderne, mais pas les anciennes. Ainsi, alors que les deux exemples de code fonctionneront sur les iPhones actuels (en synthétisant le stockage nécessaire), le second exemple échouera à compiler pour le simulateur à moins que vous n'ayez un Xcode à jour.

2voto

Brent Priddy Points 2889

Avec le runtime moderne, ils sont identiques (comme déjà mentionné), à l'exception du fait que les ivars qui ne sont pas explicitement définis comme dans MyObject1 n'apparaîtront pas dans le débogueur lorsque vous affichez les variables ou passez la souris sur les variables, vous devez imprimer les valeurs des variables ou définir le résumé de la variable dans la vue des variables pour afficher les propriétés.

J'ai commencé à utiliser la façon de faire de MyObject2 parce que je tape moins, mais c'est plus ennuyeux de devoir taper dans la ligne de commande gdb pour voir l'état de la variable dans le débogueur :(

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X