web-dev-qa-db-fra.com

Définitions @property avec ARC: fortes ou conservées?

En utilisant Xcode 4.2 et ARC, je remarque que le code généré automatiquement pour un NSManagedObject se lit toujours comme ceci pour les propriétés:

@property (nonatomic, retain) NSString * someString;

1) Ne devrait-on pas remplacer retain par strong ou weak?

2) Pourquoi le code généré automatiquement utilise-t-il retain

3) Quel est le remplacement correct de retain dans cette déclaration de propriété?

Je suis en train de déboguer un problème en utilisant NSFetchRequest, et j'ai pensé que cela pourrait être la source du problème. Pensées?

80
one09jason

1) Ne devrait-on pas conserver maintenant être remplacé par fort ou faible?

Non. Vous ne pouvez pas remplacer la conservation par faible; ils sont différents. Et fort est un synonyme à 100% pour conserver; ils sont identiques. Vous pouvez utiliser l'un ou l'autre, donc il n'y a pas de "devrait" ici. Vous pouvez remplacer la conservation par forte si vous le souhaitez, mais ce n'est pas obligatoire.

2) Pourquoi le code généré automatiquement utilise-t-il toujours

Pourquoi pas? Voir (1). retenir est correct donc il n'y a pas de problème.

3) Quel est le remplacement correct à conserver dans cette déclaration de propriété?

Il n'est pas nécessaire de remplacer la conservation.

Je suis en train de déboguer un problème en utilisant NSFetchRequest, et j'ai pensé que cela pourrait être la source du problème. Pensées?

Ce n'est pas le cas.

110
matt

Pour répondre à ces trois questions en une seule: retain et strong sont synonymes, donc les deux sont corrects. La documentation indique

retain implique __strong la possession

strong implique __strong la possession

40
Phlibbo

Avant ARC, vous devez "libérer" un objet qui est conservé. Cela signifie que conserver a une contrepartie. Après ARC, vous n'avez pas besoin de libérer. Utilisez donc fort. C'est un indice visuel que vous n'avez pas besoin d'appeler libération.

4
user2488343

"conserver" est égal à "fort".

"fort" est utilisé par exemple:

@property (nonatomic, strong) NSString * someString;

Et "__strong" est utilisé par exemple:

-(void) someMethod
{
    __strong NSString* vStr = [[NSString alloc] initWithString:@"some string"];
}

Sur Apple Docs. Dit:

Attributs de propriété

Les mots clés faible et fort sont introduits en tant que nouveaux attributs de propriété déclarés, comme indiqué dans les exemples suivants.

// The following declaration is a synonym for: @property(retain) MyClass *myObject;
property(strong) MyClass *myObject;

Doc Apple. http://developer.Apple.com/library/ios/#releasenotes/ObjectiveC/RN-TransitioningToARC/Introduction/Introduction.html

3
Alex