Quelqu'un peut-il m'expliquer en détail quand je dois utiliser chaque attribut: nonatomic
, copy
, strong
, weak
, etc., pour une propriété déclarée, et expliquer quoi chacun fait? Une sorte d'exemple serait bien aussi. J'utilise ARC.
Cette réponse comporte de nombreuses erreurs et est également obsolète. Veuillez consulter les autres questions/réponses et les commentaires.
non atomique
nonatomic
est utilisé à des fins de multi-threading. 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.
Copier
copy
est requis lorsque l'objet est mutable. Utilisez cette option si vous avez besoin de la valeur de l'objet telle qu'elle est à ce moment-là et que vous ne voulez pas que cette valeur reflète les modifications apportées par les autres propriétaires de l'objet. Vous devrez libérer l'objet lorsque vous aurez terminé, car vous conserverez la copie.
Assign
Assign
est un peu à l'opposé de copy
. Lors de l'appel du getter d'une propriété assign
, il renvoie une référence aux données réelles. En général, vous utilisez cet attribut lorsque vous avez une propriété de type primitif (float, int, BOOL ...)
Conserver
retain
est requis lorsque l'attribut est un pointeur sur un objet. Le setter généré par @synthesize
conservera (c'est-à-dire ajoutera un nombre de retenues à). Vous devrez libérer l'objet quand vous en aurez fini. En utilisant retenue, cela augmentera le nombre de retenues et occupera de la mémoire dans le pool de libération automatique.
Fort
strong
remplace l'attribut Retain dans le cadre du comptage automatisé de références Objective-C (ARC). En code non-ARC, c'est juste un synonyme pour conserver.
C’est un bon site Web pour en savoir plus sur strong
et weak
pour iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part -1
Faible
weak
est similaire à strong
sauf qu'il n'augmentera pas le nombre de références de 1. Il ne devient pas propriétaire de cet objet, mais en contient simplement une référence. Si le nombre de références de l'objet tombe à 0, même si vous le pointez encore ici, il sera libéré de la mémoire.
Le lien ci-dessus contient à la fois de bonnes informations concernant faible et fort.
La propriété nonatomic
indique que l'objet n'est pas thread-safe, ce qui signifie que si un thread différent tente d'accéder à cet objet, de mauvaises choses peuvent arriver, mais c'est beaucoup plus rapide que la propriété atomic.
strong
est utilisé avec ARC et vous aide fondamentalement à ne pas avoir à vous soucier du nombre de retenues d'un objet. ARC le publie automatiquement pour vous lorsque vous avez terminé. Le mot-clé strong
signifie que vous possédez l'objet.
weak
La propriété signifie que vous ne la possédez pas et qu'elle ne fait que garder une trace de l'objet jusqu'à ce que l'objet auquel il a été affecté reste, dès que le deuxième objet est relâché, il perd sa valeur. Pour par exemple. obj.a=objectB;
est utilisé et a une propriété faible, sa valeur ne sera valide que jusqu'à ce que objectB reste en mémoire.
La propriété copy
est très bien expliqué ici
strong,weak,retain,copy,assign
sont mutuellement exclusifs, 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 ...
Ce lien a la panne
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
assign implique __unsafe_unretained property.
copy implique une forte propriété, ainsi que le comportement habituel de la sémantique de la copie sur le poseur.
conserver implique une forte propriété.
forte implique une forte appropriation.
unsafe_unretained implique la propriété __unsafe_unretained.
faible implique __ faible appropriation.
Excellentes réponses! Une chose que je voudrais clarifier plus profondément est nonatomic
/atomic
. L'utilisateur doit comprendre que cette propriété - "atomicity" ne se propage que sur la référence de l'attribut et non sur son contenu. C'est à dire. atomic
garantira l'atomicité de l'utilisateur pour la lecture/l'établissement 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 sur la dict
sera lu/défini de manière atomique par différents threads. MAIS le dict
lui-même (le dictionnaire dict
pointant vers) est toujours thread unsafe, c’est-à-dire que toutes les opérations de lecture/ajout au dictionnaire sont toujours des threads non sécurisés.
Si vous avez besoin d'une collection thread-safe, vous avez soit une mauvaise architecture (plus souvent) OR exigence réelle (plus rare). Si c’est "une exigence réelle", vous devez soit trouver un composant de collecte de threads sécurisé et bien testé OR être préparé aux essais et tribulations en écrivant le vôtre. Dans ce dernier cas, examinez les paradigmes "sans verrouillage", "sans attente". Cela ressemble à la science de fusée au premier abord, mais pourrait vous aider à réaliser des performances fantastiques par rapport au "verrouillage habituel".