web-dev-qa-db-fra.com

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

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.

288
Gaurav_soni

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.

557
iDhaval

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 ...

45
Ankit Srivastava

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.

17
Mick MacCallum

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".

9
DaddyM