Quels sont les nouveaux qualificatifs de type introduits avec ARC?

Le comptage automatique de references (ARC) introduit de nouveaux qualificatifs de type. J'ai vu __strong et __weak , mais que font-ils?

__strong signifie que lors de l'affectation, la valeur de l'expression sera conservée et stockée dans la lvalue en utilisant la sémantique primitive. (Pour libérer un tel object, tout ce que vous devez faire est de l'assigner à nil , l'object précédemment référencé sera libéré, nil ne sera retenu, ce qui ne fait rien et c'est des pêches et de la crème.)

__unsafe_unretained et __weak sont similaires dans le sens où l'adresse du rvalue sera assignée à la lvalue, mais si vous utilisez le qualificatif __weak , cette opération est garantie être atomique et soumise à une sémantique différente. L'un de ceux-ci est que si l'object assigné est actuellement en cours de désallocation, alors l'assignation sera évaluée à nil et sera ensuite stockée atomiquement dans la lvalue de l'expression. D'où le libellé __unsafe_unretained , parce que cette opération est en effet dangereuse et non retenue.

__autoreleasing est comme __strong sauf qu'il a une mise en garde: L'object retenu est poussé sur le pool autorelease actuel, ainsi vous pouvez par exemple get la propriété temporaire d'un object pour le retirer d'une collection et le renvoyer à l'appelant. Il y a d'autres utilisations pour cela, mais elles ont surtout à voir avec l'obtention de la propriété temporaire d'un object.

Ces comportements se présentent également dans les modificateurs de propriétés correspondants ( strong , unsafe_unretained et weak ).

Voir la spécification technique de comptage automatique des references Clang

EDIT: Pour ceux qui ne ciblent pas iOS 5 et donc incapables de récolter les bénéfices de __weak , Mike Ash a écrit un superbe article (et implémentation) sur la mise à zéro des references faibles que vous pouvez utiliser à la place.

Strong indique à ARC de conserver la propriété.

 @property (strong,nonatomic) NSObject *object; @property (retain,nonatomic) NSObject *object; 

Faible est essentiellement assigner, une propriété non retenue. Sauf lorsque l'object est désalloué, le pointeur faible est automatiquement mis à zéro.

 @property (weak,nonatomic) NSObject *object; @property (assign,nonatomic) NSObject *object; 

Faible est seulement disponible sur iOS 4.3 et plus. Si vous souhaitez cibler iOS 4.2, vous devez utiliser unsafe_unretained, qui fonctionnera exactement comme utilisé.

Les qualificateurs de type sont __autoreleasing , __strong , __unsafe_unretained et __weak . Les modificateurs de propriété sont strong , unsafe_unretained et weak .

Jetez un coup d'oeil à la section 4 du comptage automatique des references dans la documentation LLVM / Clang.