Quelqu'un peut -il me expliquer en détail quand je dois utiliser chaque attribut: nonatomic
, copy
, strong
, weak
et 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.
objective-c
automatic-ref-counting
declared-property
Gaurav_soni
la source
la source
Réponses:
Cette réponse comporte de nombreuses erreurs et est également obsolète. Veuillez consulter les autres questions / réponses et les commentaires.
Nonatomique
nonatomic
est 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
copy
est 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
Assign
est un peu le contraire decopy
. Lors de l'appel du getter d'uneassign
proprié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
retain
est requis lorsque l'attribut est un pointeur sur un objet. Le setter généré par@synthesize
retiendra (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
strong
est 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
strong
etweak
pour iOS 5. http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1Faible
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 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.
la source
nonatomic
signifie qu'il ne doit pas être accessible simultanément par plusieurs threads. La valeur par défaut estatomic
ce qui le rend sûr pour les threads.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.strong
est 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éstrong
signifie que vous êtes propriétaire de l'objet.weak
la 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.copy
la propriété est très bien expliquée icistrong,weak,retain,copy,assign
s'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 ...
la source
nonatomic
signifie 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 queatomic
vsnonatomic
ne capture pas.Ce lien a la panne
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
la source
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. Ieatomic
garantira l'atomicité de l'utilisateur pour la lecture / la définition du pointeur et uniquement le pointeur sur l'attribut. Par exemple:Dans ce cas, il est garanti que le pointeur vers le
dict
sera lu / défini de manière atomique par différents threads. MAIS ledict
lui - même (le dictionnairedict
pointant 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".
la source