Question

Ceci est un exemple de l'Objective-C 2.0 langage de programmation. Je me demandais, dans le setter au fond, puis-je utiliser value = [newValue retain] au lieu de value = [newValue copy]?

    @interface MyClass : NSObject

{

    NSString *value;

}

@property(copy, readwrite) NSString *value;

@end



// assume using garbage collection

@implementation MyClass

@dynamic value;



- (NSString *)value {

    return value;

}



- (void)setValue:(NSString *)newValue {

    if (newValue != value) {

       value = [newValue copy];

    }

}

@end
Était-ce utile?

La solution

Le plus rapide et la plus sûre chose à faire serait d'ajouter @synthesize value en haut de votre mise en œuvre, et le compilateur génère automatiquement ces méthodes.

La question de la copie par rapport à retenir tient au fait que vous soyez passé dans un NSMutableString, qui changerait sa valeur. Si vous avez un setter pour un type « immuable » (string, ensemble, tableau, dictionnaire), vous devez utiliser la sémantique de copy. Au début, cela peut sembler contraire à l'intuition (pourquoi faire une copie si elle est immuable?), Mais la chose à réaliser est que votre classe veut assumer est immuable, et ce qui est passé dans ne peut pas réellement être immuable.

cours NSMutable mettre en œuvre le sélecteur de copy en retournant une version immuable de ce qu'ils représentent. Les classes immuables (NSString, etc.) mettent en œuvre copy avec un appel retain. C'est-à-dire, ils sont très rapides.

Votre setter doit également libérer value avant de l'assigner une nouvelle valeur. Le code approprié est:

-(void)setValue:(NSString*)newvalue
{
    if (value != newvalue)
    {
        [value release];
        value = [newvalue copy];
    }
}

Si vous avez un contrôle total sur toutes les classes qui peuvent faire appel setValue: et sont tout à fait sûr que vous ne passerez dans NSMutableString, vous pouvez utiliser retain, mais il est préférable d'utiliser des pratiques copy.

Autres conseils

Cela dépend. Si vous utilisez [newValue retain], un autre objet peut changer la valeur de ce pointeur NSString. Normalement, vous ne voulez pas avoir ce comportement.

Non, l'interface dit copy. Si quelqu'un passe dans un NSMutableString, vous obtiendrez des résultats très différents des deux méthodes.

mutateur:

  -(void)setValue:(NSString*)newvalue{
        if (_value != newvalue)
        {
            [_value release];
            _value = nil;
            _value = [newvalue copy];

        }
   }
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top