7
votes

Sont des variables privées dans l'objectif-c fort?

Alors, à la recherche d'un débordement de pile Ceci semble être de savoir comment faire des variables privées dans Objective-C:

@interface ClassName()
{
@private
    NSArray* private;
}
@property (strong, nonatomic) NSArray* public;
@end


1 commentaires

FYI - Le code que vous avez posté est l'ancienne façon de faire des choses. Les ivars privés appartiennent maintenant au bloc @Implementatation dans le fichier .m. En outre, il n'est pas nécessaire de déclarer des ivars pour les propriétés. Et il n'est pas nécessaire d'avoir un @synthesize explicite appel. Déclarez simplement le @property dans le .h et vous avez terminé. Le compilateur synthétisera automatiquement un ivar.


3 Réponses :


3
votes

Les qualifications sur @Property Spécifiez le comportement du SETTER synthétisé et d'un autre code inséré Arc. Les variables elles-mêmes ne sont pas vraiment fortes ou non, ce ne sont que des emplacements de mémoire. Donc, vous l'avez codé fort en ce moment.

Le moyen de le rendre privé (et fort) est de le déclarer fort dans une catégorie à l'intérieur du fichier. xxx < / p>


5 commentaires

"Les variables elles-mêmes ne sont pas vraiment fortes ou non, ce ne sont que des emplacements de mémoire." - c'est faux. Tous les objets Objective-C ont une propriété qui est par défaut __strong.


C'est métaphorique. Cette citation indique une convention sur la manière de traiter ces emplacements de mémoire. Les variables d'instance sont des octets dans une structure finalement, ils ne sont pas stockés avec des bits supplémentaires expliquant comment ils doivent être traités au moment de l'exécution. C'est une table de compilation.


Ceci est un peu comme dire "les variables d'instance ne sont pas typées, elles ne sont que des bits dans une structure". Le fait qu'une variable soit représentée par des bits ne change pas de fait le fait que sémantiquement, il a également d'autres attributs. Les variables peuvent être __strong ou _wak, que ce soit ou non un @property existe.


+1 pour le vrai point et la bonne analogie. Ces choses sont décidées par la convention (comme si nous pouvions en faire une place qui dit que les 4 octets non donnés sont traités comme des INTS). Ma lecture sur la question de l'OP était d'où vient l'arc sémantique? Ils viennent de la Déclaration de @Property si vous avez déclaré ou non la structure explicitement.


+1 Pour l'instruction Comment déclarer correctement une propriété privée.



13
votes

Les variables d'instance sont __ fort par défaut.

de Guide de transition ARC d'Apple , concernant les variables (présumé inclure des variables d'instance):

__ forte est la valeur par défaut

et plus tard:

avec arc, les variables d'instance sont de fortes références par défaut-attribution d'un objet à une variable d'instance directement prolonger la durée de vie de l'objet

Ceci tient jusqu'à ce que la propriété soit connectée à la ivar via @synthesize . À ce stade, le qualificatif de propriété de la propriété a priorité. Cependant, si vous déclarez une propriété comme tout-chose, mais forte, puis mettez en œuvre les secteurs et les getters à la main, vous devrez également déclarer manuellement le qualificatif de propriété de l'ivar de support également.


0 commentaires

9
votes

Dans le cas d'une propriété, la propriété de la variable d'instance associée est implicite par la propriété de la propriété:

voir http://clang.llvm.org/docs/automaticreferencounting.html :

Si une propriété est synthétisée, la variable d'instance associée est la variable d'instance nommée, éventuellement implicitement, par le @synthèse Déclaration. Si la variable d'instance associée déjà existe, alors sa qualification de propriété doit être égale à la propriété de la propriété; Sinon, la variable d'instance est créée avec cela qualification de propriété.

Généralement, les objets Objective-C sont par défaut fort:

Si un objet est déclaré avec un type de propriétaire d'objet retentiable, mais Sans qualificatif de propriété explicite, son type est implicitement ajusté pour avoir une qualification __STRONG.

Notez que depuis le compilateur LLVM 4.0 (xcode 4.4), l'instruction @synthesize et la variable d'instance associée est créée automatiquement, vous n'avez donc besoin que de déclarer la propriété.


0 commentaires