Attributs @property déclarés en Objective-C (non anatomique, copie, fort, faible)

289

Quelqu'un peut -il me expliquer en détail quand je dois utiliser chaque attribut: nonatomic, copy, strong, weaket ainsi de suite, pour une propriété déclarée, et expliquer ce que chacun fait? Une sorte d'exemple serait également formidable. J'utilise ARC.

Gaurav_soni
la source
Voici la réponse stackoverflow.com/a/32942413/1961064
Grigori Jlavyan
rypress.com/tutorials/objective-c/properties cela explique tout
Deepak Thakur

Réponses:

559

Cette réponse comporte de nombreuses erreurs et est également obsolète. Veuillez consulter les autres questions / réponses et les commentaires.


Nonatomique

nonatomicest utilisé à des fins de filetage multiple. Si nous avons défini l'attribut nonatomic au moment de la déclaration, alors tout autre thread souhaitant accéder à cet objet peut y accéder et donner des résultats en ce qui concerne le multi-threading.

Copie

copyest requis lorsque l'objet est modifiable. Utilisez-le si vous avez besoin de la valeur de l'objet telle qu'elle est en ce moment et que vous ne souhaitez pas que cette valeur reflète les modifications apportées par d'autres propriétaires de l'objet. Vous devrez libérer l'objet lorsque vous en aurez terminé car vous conservez la copie.

Attribuer

Assignest un peu le contraire de copy. Lors de l'appel du getter d'une assignpropriété, il renvoie une référence aux données réelles. En règle générale, vous utilisez cet attribut lorsque vous avez une propriété de type primitif (float, int, BOOL ...)

Conserver

retainest requis lorsque l'attribut est un pointeur sur un objet. Le setter généré par @synthesizeretiendra (ou ajoutera un nombre de retenues à) l'objet. Vous devrez libérer l'objet lorsque vous en aurez terminé avec lui. En utilisant retenir, il augmentera le nombre de retenues et occupera la mémoire dans le pool de libération automatique.

Fort

strongest un remplacement de l'attribut retenir, dans le cadre du comptage de référence automatisé (ARC) d'Objective-C. Dans le code non ARC, c'est juste un synonyme de conserver.

Ceci est un bon site Web pour en savoir plus sur stronget weakpour iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

Faible

weakest similaire à, strongsauf qu'il n'augmentera pas le nombre de références de 1. Il ne devient pas propriétaire de cet objet mais contient simplement une référence à celui-ci. Si le nombre de références de l'objet tombe à 0, même si vous le pointez ici, il sera désalloué de la mémoire.

Le lien ci-dessus contient à la fois de bonnes informations concernant faible et fort.

iDhaval
la source
1
si vous utilisez cette NSString uniquement en interne dans cette classe elle-même, vous n'avez même pas besoin d'une propriété, vous pouvez simplement en faire un iVar et si vous l'utilisez dans une autre classe que je vous conseillerai (fort, copie).
Ankit Srivastava
1
Il vous manque la propriété Assign.
mskw
10
nonatomicsignifie qu'il ne doit pas être accessible simultanément par plusieurs threads. La valeur par défaut est atomicce qui le rend sûr pour les threads.
wcochran
1
Il est un peu troublant de constater qu'après tout ce temps, la définition de nonatomique est toujours erronée et ressemble à atomique. Je me demande combien de personnes ont utilisé cela au cours des cinq dernières années et ont eu une mauvaise impression. Ce que @wcochran a dit était correct. nonatomique signifie que l'accès au pointeur n'est pas géré de manière atomique et n'est donc pas thread-safe. L'avantage que je comprends de non anatomique est qu'il est plus léger.
John Bushnell
1
En plus du commentaire de @JohnBushnell, il y a beaucoup d'autres erreurs et inexactitudes dans cette réponse. Il n'a pas non plus bien vieilli, il est donc quelque peu historique. Allez voir ailleurs si vous cherchez une réponse à cette question.
CRD
45

nonatomic La propriété indique que l'objet n'est pas sûr pour les threads, ce qui signifie que si un thread différent essaie d'accéder à cet objet, de mauvaises choses peuvent se produire, mais c'est beaucoup plus rapide que la propriété atomique.

strongest utilisé avec ARC et il vous aide essentiellement, en n'ayant pas à vous soucier du nombre de conserver d'un objet. ARC le libère automatiquement pour vous lorsque vous en avez terminé. L'utilisation du mot-clé strongsignifie que vous êtes propriétaire de l'objet.

weakla propriété signifie que vous ne le possédez pas et qu'il ne fait que suivre l'objet jusqu'à ce que l'objet auquel il a été affecté reste, dès que le deuxième objet est libéré, il perd sa valeur. Par exemple. obj.a=objectB;est utilisé et a a une propriété faible, sa valeur ne sera valide que jusqu'à ce que objectB reste en mémoire.

copyla propriété est très bien expliquée ici

strong,weak,retain,copy,assigns'excluent mutuellement, vous ne pouvez donc pas les utiliser sur un seul objet ... lisez la section "Propriétés déclarées"

en espérant que cela vous aide un peu ...

Ankit Srivastava
la source
pourquoi fort, faible, conserver, copier, attribuer mutuellement exclusif
vinoth.kumar
nonatomicsignifie simplement qu'aucune exclusion n'est appliquée. Cela ne signifie pas que l'accès n'est pas sûr pour les threads. C'est un détail d'implémentation que atomicvs nonatomicne capture pas.
bbum
@bbum Pouvez-vous expliquer la différence entre aucune exclusion et non thread-safe ..?
Ankit Srivastava
1
L' exclusion @AnkitSrivastava est lorsque le thread A empêche le thread B de descendre dans un chemin de code. Si ce chemin de code est sûr pour l'exécution à partir de plusieurs threads, l'exclusion n'est pas nécessaire. Non thread-safe signifie que le chemin du code peut donner des résultats indéfinis si A et B le descendent simultanément. C'est-à-dire que l' exclusion peut être utilisée pour rendre quelque chose sûr pour les threads, mais la sécurité des threads ne nécessite pas une exécution exclusive - non simultanée -.
bbum
17

Ce lien a la panne

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

assign implique la propriété __unsafe_unretained.

La copie implique la propriété __strong, ainsi que le comportement habituel de la sémantique de copie sur le setter.

conserver implique une propriété solide.

forte implique une propriété solide.

unsafe_unretained implique la propriété __unsafe_unretained.

faible implique une faible propriété.

Mick MacCallum
la source
la propriété Assign n'est-elle pas uniquement utilisée pour iVar et les valeurs? Alors pourquoi est-il dangereux et pourquoi faut-il noter qu'il n'est pas conservé?
mskw
9

Excellentes réponses! Une chose que je voudrais clarifier plus en profondeur est nonatomic/ atomic. L'utilisateur doit comprendre que cette propriété - "atomicité" se propage uniquement sur la référence de l'attribut et non sur son contenu. Ie atomicgarantira l'atomicité de l'utilisateur pour la lecture / la définition du pointeur et uniquement le pointeur sur l'attribut. Par exemple:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...

Dans ce cas, il est garanti que le pointeur vers le dictsera lu / défini de manière atomique par différents threads. MAIS le dictlui - même (le dictionnaire dictpointant vers) est toujours dangereux pour les threads , c'est-à-dire que toutes les opérations de lecture / ajout au dictionnaire sont toujours dangereuses pour les threads.

Si vous avez besoin d'une collection thread-safe, vous avez soit une mauvaise architecture (plus souvent) OU une réelle exigence (plus rare). S'il s'agit d'une "exigence réelle" - vous devriez soit trouver un composant de collecte sûr et testé, soit être prêt pour les essais et les tribulations en écrivant le vôtre. Dans ce dernier cas, nous examinons les paradigmes "sans verrouillage" et "sans attente". Cela ressemble à la science des fusées à première vue, mais pourrait vous aider à obtenir des performances fantastiques par rapport au "verrouillage habituel".

nickolay
la source