Numéro 1 diffère des deux autres par l'avant de déclarer la MyOtherObject classe de réduire la quantité de code vu par le compilateur et l'éditeur de liens et aussi potentiellement d'éviter les références circulaires. Si vous le faites de cette façon, n'oubliez pas de mettre le #importer dans le .m de fichier.
En déclarant un @biens, et la correspondance @synthétiser dans le .m) de fichiers, vous générez automatiquement des méthodes d'accès à la mémoire sémantique manipulés comment vous spécifiez. La règle de base pour la plupart des objets est de Retenir, mais NSStrings, par exemple, doit utiliser la Copie. Alors que les Singletons et les Délégués doivent généralement utiliser les Affecter. La main écrit des accesseurs est fastidieux et source d'erreurs, donc cela permet d'économiser beaucoup de temps de frappe et muets de bugs.
Aussi, la déclaration d'une synthétisés de la propriété vous permet d'appeler une méthode d'accesseur en utilisant la notation point comme ceci:
self.otherObj = someOtherNewObject; // set it
MyOtherObject *thingee = self.otherObj; // get it
Au lieu de la normale, de transmission de message de la manière:
[self setOtherObject:someOtherNewObject]; // set it
MyOtherObject *thingee = [self otherObj]; // get it
Derrière les scènes que vous avez vraiment appeler une méthode qui ressemble à ceci:
- (void) setOtherObj:(MyOtherObject *)anOtherObject {
if (otherObject == anOtherObject) {
return;
}
MyOtherObject *oldOtherObject = otherObject; // keep a reference to the old value for a second
otherObject = [anOtherObject retain]; // put the new value in
[oldOtherObject release]; // let go of the old object
} // set it
...ou cette
- (MyOtherObject *) otherObject {
return otherObject;
} // get it
Total de la douleur dans le cul, à droite. Maintenant le faire pour tous les ivar dans la classe. Si vous ne le faites pas exactement droite, vous obtenez une fuite de mémoire. Préférable de laisser le compilateur faire le travail.
Je vois que le Numéro 1 n'a pas d'ivar. En supposant que ce n'est pas une faute de frappe, c'est bien parce que les @property / @synthétiser les directives de déclarer une ivar pour vous aussi, derrière les coulisses. Je crois que c'est nouveau pour Mac OS X Snow Leopard et de l'iOS4.
Numéro 3 n'a pas ces accesseurs généré de sorte que vous avez à les écrire vous-même. Si vous voulez que vos méthodes accesseur pour avoir des effets secondaires, vous faites votre gestion de mémoire standard de la danse, comme indiqué ci-dessus, puis faire quelque côté que ce travail vous avez besoin, à l'intérieur de la méthode d'accesseur. Si vous synthétiser une propriété ainsi que l'écriture de vos propres, alors votre version a la priorité.
Je n'ai tout couvrir?