2010-05-06 5 views
3

Après avoir lu un question on @private je comprends comment cela fonctionne. Cependant, comme toutes les variables sont par défaut @protected et que vous ne pouvez pas vraiment accéder à une variable sans définir un accesseur, que fait exactement @public? Quand l'utiliseriez-vous?Que signifie "@public" en Objective-C?

Répondre

2

Quand souhaitez-vous l'utiliser? Quand vous en avez besoin pour être public. Pour y accéder depuis l'extérieur de cette classe (sans aucun accesseur supplémentaire), c'est-à-dire. :)

0

@public est un modificateur de visibilité. Cela signifie que les variables d'instance déclarées comme @public peuvent être accédées par des instances de n'importe quelle classe. Les membres publics peuvent être accédés par des sous-classes ou d'autres classes. En revanche, les membres privés ne peuvent pas accéder à par des sous-classes ou d'autres classes.

5

@public signifie que l'ivar est accessible partout.

@private signifie que le Ivar est accessible aux instances de la classe

@protected signifie que le Ivar est accessible aux instances de la classe et sous-classe.

Pour accéder à un ivar public en dehors de la classe, utilisez l'opérateur C struct pointeur standard -> p. Ex.

foo->instanceVarible = xyzzy; 

Quand souhaitez-vous l'utiliser? Dans mon cas: jamais. I toujours définir des variables d'instance comme @private (sauf IBOutlets) et utiliser des accesseurs pour y accéder en dehors de la classe.

+0

Je comprends d'où vous venez, mais quand même, IMO, je trouve qu'il est un peu exagéré de TOUJOURS créer des variables privées avec des accesseurs quand ils sont réellement conçus pour être, et agir en public. – treznik

+0

Il devient une seconde nature après un certain temps et certainement, si ce sont des objets, vous aurez besoin d'accesseurs de toute façon, sauf si vous utilisez GC. – JeremyP

0

Cette question concerne les pratiques de codage.

Si vous écrivez un code très strict, vous utiliserez toujours @private pour les variables d'instance pour vous assurer que seules les fonctions de classe peuvent y accéder. À mon avis, cela n'est nécessaire que dans des cas très spécifiques, par exemple, des variables de classe (où il y a une variable pour plusieurs instances d'une classe).

La plupart du temps @protected est la plus appropriée pour les variables d'instance normales car elle permet aux sous-classes d'y accéder directement. C'est beaucoup plus naturel et est compatible avec l'idée d'étendre une classe. En fonction de la manière dont vous y accédez, Objective C peut utiliser les fonctions setter et getter de cette classe. @protected est souhaitable pour un code efficace et pour rendre le code plus lisible. Le @public est réservé à la programmation rapide ou sale. Où il peut être juste plus rapide d'accéder au membre de l'instance directement, ou peut-être lorsque vous êtes en interface avec un autre langage/bibliothèque de programmation et que vous écrivez de la colle. J'essaie de l'éviter car cela signifie que la maintenance du code est plus difficile.

Évidemment, vous pouvez simplement utiliser @public tout le temps - retour au bon vieux temps de la programmation C.

Vous pouvez bien sûr choisir ne définir aucun accesseurs pour une variable de classe, car il est interne à la classe ou parce que vous déclarez est comme @public mais comme objectif C, il est facile de les prototype avec @property et @synthesize il ne semble pas beaucoup point. Les variables de classe internes n'ont pas besoin de setters/getters car toute méthode de classe peut y accéder directement.