Il existe deux nouveaux attributs de gestion de la mémoire pour les propriétés introduites par ARC strong
et weak
.
En dehors de copy
ce qui est évidemment quelque chose de complètement différent, y a-t-il des différences entre strong
vs retain
et weak
vs assign
?
D'après ma compréhension, la seule différence ici est que le pointeur weak
sera assigné nil
, alors que assign
ce ne sera pas le cas, ce qui signifie que le programme se bloquera lorsque j'enverrai un message au pointeur une fois qu'il sera libéré. Mais si j'utilise weak
, cela n'arrivera jamais, car envoyer un message à nil
ne fera rien.
Je ne connais aucune différence entre strong
et retain
.
Y a-t-il une raison pour laquelle je devrais utiliser assign
et retain
dans de nouveaux projets, ou est-ce que le type est déconseillé?
la source
strong
,weak
etunsafe_unretained
.weak
etstrong
) et 4 qualificatifs à vie variables (__strong
,__weak
,__unsafe_unretained
,__autoreleasing
). Voir les notes ARC ci-dessous.assign
lors de la compilation avec ARC était une erreur. Il existe de nombreuses réponses supprimées à ce sujet. Il semble que cela ait été changé avant la version finale.unsafe_unretained
est l'attribut préféré de beaucoup d'entre nous parmi les premiers à adopter. Pour la preuve qu'ilunsafe_unretained
s'agit d'un attribut valide, consultez "Programmation avec Objective-C" d'Apple dans la section "Encapsulation de données" sous le sous-titre "Utiliser des références non conservées non sécurisées pour certaines classes". Qui dit: "Pour une propriété, cela signifie utiliser l'attribut unsafe_unretained:"Réponses:
De la transition vers les notes de version ARC (l'exemple de la section sur les attributs de propriété).
C'est
strong
la même chose queretain
dans une déclaration de propriété.Pour les projets ARC que j'utiliserais à la
strong
placeretain
, j'utiliseraisassign
pour les propriétés primitives C etweak
pour les références faibles aux objets Objective-C.la source
assign
pour un objet. Vous devez utiliser soitweak
ouunsafe_unretained
(ce qui n'est pas sûr, évidemment) si vous ne souhaitez pas conserver la propriété.assign
compile très bien pour moi dans les projets ARC avec la cible de déploiement 4.0.retain
vs.strong
. Je suppose que c'est surtout inoffensif, mais j'imagine que cela devrait êtrestrong
pour la cohérence ... ou peut-être que cela n'a pas d'importance. stackoverflow.com/questions/7796476/…assign
est toujours valable dans certains cas.Après avoir lu tant d'articles Stackoverflow et d'applications de démonstration pour vérifier les attributs des propriétés variables, j'ai décidé de rassembler toutes les informations sur les attributs:
Ci-dessous le lien détaillé de l'article où vous pouvez trouver tous les attributs mentionnés ci-dessus, qui vous aideront certainement. Un grand merci à toutes les personnes qui donnent les meilleures réponses ici !!
1. fort (iOS4 = conserver)
Exemple:
2. faible -
Exemple :
Explication forte et faible, merci à BJ Homer :
Lorsque nous utilisons faible?
La seule fois que vous voudriez utiliser faible, c'est si vous voulez éviter les cycles de rétention (par exemple, le parent retient l'enfant et l'enfant conserve le parent afin qu'aucun des deux ne soit jamais libéré).
3. retenir = fort
Exemple:
4. attribuer
Exemple:
la source
default
signifie? Si je l'utilise@property (nonatomic) NSString *string
c'eststrong
? Ouassign
? Parce que les deux sont des valeurs par défaut.non atomique / atomique
fort / faible / assigner
(Optionnel)
copie
lecture seulement
la source
Pour autant que je sache,
strong
etretain
sont des synonymes, ils font donc exactement la même chose.Ensuite, le
weak
est presque commeassign
, mais automatiquement défini sur nil après que l'objet, il pointe vers, est désalloué.Cela signifie que vous pouvez simplement les remplacer.
Cependant , il y a un cas spécial que j'ai rencontré, où j'ai dû utiliser
assign
plutôt queweak
. Disons que nous avons deux propriétésdelegateAssign
etdelegateWeak
. Dans les deux est stocké notre délégué, qui nous possède en ayant la seule référence forte. Le délégué désalloue, donc notre-dealloc
méthode est appelée aussi.Le délégué est déjà en processus de désallocation, mais n'est pas encore entièrement désalloué. Le problème est que les
weak
références à lui sont déjà annulées! La propriétédelegateWeak
contient nil, maisdelegateAssign
contient un objet valide (avec toutes les propriétés déjà publiées et annulées, mais toujours valides).C'est un cas assez spécial, mais il nous révèle comment ces
weak
variables fonctionnent et quand elles sont annulées.la source
Le document de Clang sur l' Objective-C Automatic Reference Counting (ARC) explique clairement les qualificatifs et modificateurs de propriété:
Ensuite, il existe six modificateurs de propriété pour la propriété déclarée:
Sémantiquement, les qualificatifs de propriété ont une signification différente dans les cinq opérations gérées : lecture, affectation, initialisation, destruction et déplacement, dans lesquelles la plupart du temps, nous ne nous soucions que de la différence dans l'opération d'affectation.
L'autre différence dans Reading, Init, Destruction et Moving, veuillez vous référer à la section 4.2 Sémantique du document .
la source
Pour comprendre la référence forte et faible, considérons l'exemple ci-dessous, supposons que nous ayons une méthode nommée displayLocalVariable.
Dans la méthode ci-dessus, la portée de la variable myName est limitée à la méthode displayLocalVariable, une fois que la méthode est terminée, la variable myName qui contient la chaîne "ABC" sera désallouée de la mémoire.
Maintenant, que faire si nous voulons conserver la valeur de la variable myName tout au long de notre cycle de vie du contrôleur de vue. Pour cela, nous pouvons créer la propriété nommée comme nom d'utilisateur qui aura une référence forte à la variable myName (voir
self.username = myName;
dans le code ci-dessous), comme ci-dessous,Maintenant, dans le code ci-dessus, vous pouvez voir que myName a été attribué à self.username et self.username a une référence forte (comme nous l'avons déclaré dans l'interface en utilisant @property) à myName (indirectement, il a une référence forte à la chaîne "ABC"). Par conséquent, String myName ne sera pas désalloué de la mémoire tant que self.username n'est pas vivant.
Envisagez maintenant d'affecter myName à dummyName qui est une référence faible, self.dummyName = myName; Contrairement à la référence forte, la valeur faible ne contiendra le nom que jusqu'à ce qu'il y ait une référence forte à mon nom. Voir le code ci-dessous pour comprendre la référence faible,
Dans le code ci-dessus, il y a une référence faible à myName (c'est-à-dire que self.dummyName a une référence faible à myName) mais il n'y a pas de référence forte à myName, donc self.dummyName ne pourra pas contenir la valeur myName.
Maintenant, considérez à nouveau le code ci-dessous,
Dans le code ci-dessus, self.username a une référence forte à myName, donc self.dummyName aura désormais une valeur de myName même après la fin de la méthode, car myName a une référence Strong associée.
Maintenant, chaque fois que nous faisons une référence forte à une variable, son nombre de retenues est augmenté de un et la variable n'obtiendra pas le nombre de retenues désallouées atteignant 0.
J'espère que cela t'aides.
la source
Fort:
Exemple: @property (strong, nonatomic) ViewController * viewController;
@synthesize viewController;
Faible
Par défaut, obtient et définit automatiquement nil
Exemple: @property (faible, non anatomique) IBOutlet UIButton * myButton;
@synthesize myButton;
la source
Les différences entre fort et retenir:
Les différences entre faible et assigné:
la source