Les différences entre les forts et les faibles en Objective-C
Je suis nouveau à l'Obj-C, donc ma première question est:
Quelles sont les différences entre strong
et weak
dans @property
déclarations de pointeurs vers des objets?
Aussi, ce qui ne nonatomic
veux dire?
- effectivement, c'est une bonne question, parfois, nous avons oublié comment le concept de base de la force et de faiblesse et atomique/nonatomic préférences.... 🙂 Merci à vous de nous rappeler à ce sujet...
- Ce qui est drôle, c'est que le projet de recherche simple sur google pour m'amener ici lol. #circularreference
- J'ai tendance à ne faire confiance à beaucoup de réponses sur google, mais de toujours se référer à S. O pour les réponses intelligentes
Vous devez vous connecter pour publier un commentaire.
Une référence forte (ce qui vous permettra de l'utiliser dans la plupart des cas) signifie que vous voulez "propre" de l'objet que vous faites référence à cette propriété/variable. Le compilateur prendra soin que n'importe quel objet que vous attribuez à cette propriété ne sera pas détruit aussi longtemps que vous pointez dessus avec une référence forte. Seulement une fois que vous définissez la propriété
nil
sera l'objet de la destruction (sauf si un ou plusieurs autres objets ont également une forte référence).En revanche, avec une référence faible, vous signifiez que vous ne voulez pas avoir de contrôle sur l'objet de la durée de vie. L'objet de référencement faiblement seulement dans nos vies parce que au moins un autre objet détient une solide référence. Une fois que ce n'est plus le cas, l'objet est détruit et votre faiblesse de la propriété sera automatiquement mis à
nil
. La plus fréquente des cas d'utilisation de la faiblesse des références dans iOS sont:délégué propriétés, qui sont souvent référencés faiblement pour éviter de conserver des cycles, et
des sous-vues/contrôles de la vue du contrôleur de la vue principale, parce que ces points de vue sont déjà fortement occupé par l'affichage principal.
atomique contre nonatomic se réfère à la sécurité des threads de getter et setter que le compilateur fait la synthèse de la propriété. atomique (valeur par défaut) indique au compilateur de faire les méthodes d'accès à l'thread-safe (par l'ajout d'un verrou avant un ivar est accessible) et nonatomic fait le contraire. L'avantage de nonatomic est légèrement plus élevé de performance. Sur iOS, Apple utilise nonatomic pour presque toutes leurs propriétés si le conseil général est pour vous de faire de même.
atomic
garantit que le bien peut être en toute sécurité de lire et d'écrire à partir de plusieurs threads en même temps. Cela ne veut pas dire un objet dont les propriétés sont toutesatomic
est automatiquement thread-safe.Il peut être utile de penser au sujet de la solidité et de la faiblesse des références en termes de ballons.
Un ballon s'envole pas, à condition qu'au moins une personne s'accroche à une corde attachée à elle. Le nombre de personnes participant à des chaînes est de conserver le comte. Quand on s'accroche à une corde, le ballon va s'envoler (dealloc). Beaucoup de gens peuvent avoir des chaînes à la même ballon. Vous pouvez obtenir/définir les propriétés et appeler des méthodes sur l'objet référencé à la fois forts et faibles références.
Une référence forte, c'est comme se tenant à une corde pour que le ballon. Tant que vous êtes accroché à une corde attachée au ballon, il ne va pas s'envoler.
Une référence faible est comme regarder le ballon. Vous pouvez le voir, accéder à ses propriétés, l'appel de méthodes, mais vous n'avez pas de chaîne de cette bulle. Si tout le monde se tenant sur la chaîne laisse aller, le ballon s'envole, et vous ne pouvez pas y accéder plus.
strong
etweak
réellement dire.strong
/weak
,atomic
,nonatomic
en C++, C#, comme ils sont mes arrière-plan, je vais avoir un moment difficile avec l'ensemble du concept pourquoi il est encore nécessaire, mais si je vois ce qui se fait dans d'autres langues que je peux obtenir ce que l'un ha cliquez sur le moment.forte: assigne la valeur entrante, il va conserver la valeur entrante et la libération de la valeur actuelle de la variable d'instance
faible: affectez la valeur entrante à elle sans retenue.
De sorte que la différence de base est le maintien de la nouvelle variable.
En général, vous voulez le conserver, mais il y a des situations où vous ne voulez pas avoir, sinon vous obtiendrez un cycle de conserver et ne peut pas libérer la mémoire les objets. Par exemple. obj1 conserve obj2 et obj2 conserve obj1. Pour résoudre ce genre de situation, l'utilisation de références faibles.
Un mannequin de réponse :-
Je pense que l'explication est donnée dans la réponse ci-dessus, donc je m'en vais vous dire où utiliser
STRONG
et où utiliserWEAK
:Utilisation de
Weak
:-1. Les délégués
2. Points de vente
3. Les sous-vues
4. Les contrôles, etc.
Utilisation de
Strong
:-Reste partout ce qui n'est pas inclus dans
WEAK
.forte et faible, ces mots-clés tourne autour de le propriétaire de l'Objet en Objective-C
Qu'est-ce que le propriétaire de l'objet ?
Pointeur de variables implique la propriété de l'objet qu'ils désignent.
À chaque fois qu'une variable du pointeur pointe sur un objet, cet objet a un propriétaire, et rester en vie. Ceci est connu comme un forte de référence.
Une variable peut éventuellement ne pas prendre possession d'un objet vers lequel il pointe. Une variable qui n'est pas la propriété d'un objet qui est connu comme un faible de référence.
Ont un look pour une explication détaillée ici Démystifier @biens et des attributs
Ici, la Documentation d'Apple a expliqué la différence entre faibles et forts de la propriété à l'aide de divers exemples :
https://developer.apple.com/library/ios/documentation/cocoa/conceptual/ProgrammingWithObjectiveC/EncapsulatingData/EncapsulatingData.html#//apple_ref/doc/uid/TP40011210-CH5-SW3
Ici, Dans ce blog, l'auteur a collecté toutes les propriétés dans un même lieu. Il vous aidera à comparer les propriétés caractéristiques :
http://rdcworld-iphone.blogspot.in/2012/12/variable-property-attributes-or.html
forte est la valeur par défaut. Un objet reste “vivante” tant qu'il y a une forte pointeur.
faible spécifie une référence qui ne garde pas l'objet référencé vivant. Une faiblesse de référence est définie à zéro lorsqu'il n'y a de solides références à l'objet.
À comprendre Forts et Faibles de référence considérons l'exemple ci-dessous, supposons que nous avons méthode nommée comme displayLocalVariable.
Au-dessus de la portée de la méthode de myName variable est limitée à displayLocalVariable méthode, une fois que la méthode est fini myName variable, qui est à la chaîne "ABC" puisse être libéré de la mémoire.
Maintenant, si nous voulons tenir le myName valeur de la variable tout au long de notre point de vue, contrôleur de cycle de vie. Pour cela, nous pouvons créer de la propriété nommée en tant que nom d'utilisateur, qui aura une Forte référence à la variable myName(voir
@property(nonatomic,strong) NSString* username;
etself.username = myName;
dans le code ci-dessous), comme ci-dessous,Maintenant dans le code ci-dessus, vous pouvez voir myName a été attribué à soi-même.nom d'utilisateur et d'auto.nom d'utilisateur est d'avoir une référence forte(comme nous l'avons dit dans l'interface à l'aide de @biens) à myName(indirectement, c'est d'avoir une Forte référence à la chaîne "ABC"). Par conséquent String nomutilisateur ne sera pas obtenir de désallouer de la mémoire jusqu'à l'auto.nom d'utilisateur est vivant.
Maintenant envisager de confier des myName à dummyName qui est une référence Faible, de l'auto.dummyName = nomutilisateur; à la différence de une Forte référence Faible tiendra le myName que jusqu'à il y a une Forte référence à monnom. Voir ci-dessous le code pour comprendre la Faiblesse de référence,
Dans le code ci-dessus il y a peu de référence à myName(c'est à dire de soi.dummyName est Faible référence à myName), mais il n'y a aucune référence à monnom, donc l'autonomie.dummyName ne sera pas en mesure de tenir les myName valeur.
Maintenant à nouveau du code ci-dessous,
Dans le code ci-dessus de soi.nom d'utilisateur a une référence Forte à monnom, donc l'autonomie.dummyName ont maintenant une valeur de myName même après la méthode se termine depuis myName a une référence Forte associés.
Maintenant, chaque fois que nous faisons une Forte référence à une variable, c'est de conserver le comte augmentée par un et la variable ne sera pas désallouées jusqu'iy de conserver le compte à rebours atteint 0.
Espère que cette aide.
Forte: Principalement Utilisé Avec les Propriétés que nous avons utilisé pour récupérer ou envoyer des données à partir de/dans un autre cours.
Faible: Généralement tous les points de vente, les connexions sont de type Faible, à partir de l'Interface.
Nonatomic: ce type de propriétés sont utilisées dans les conditions où nous ne voulons pas partager notre prise de courant ou d'un objet dans différents Threads simultanés. En d'autres termes, Nonatomic exemple faire de nos propriétés à traiter avec un seul thread à la fois.
Heureusement qu'il est utile pour vous.