2010-05-29 5 views
3

Ok, donc j'ai une méthode qui prend un NSString en entrée, fait une opération sur le contenu de cette chaîne, et retourne la chaîne traitée. Ainsi, la déclaration est:Devrais-je retourner un NSMutableString dans une méthode qui retourne NSString

- (NSString *) processString: (NSString *) str; 

La question: dois-je revenir juste le NSMutableString exemple que je mon « travail » tampon, ou devrais-je créer un nouveau NSString autour de celui mutable, et le retour qui?

dois-je faire donc ceci:

- (NSString *) processString: (NSString *) str 
{ 
    NSMutableString *work = [NSMutableString stringWithString: str]; 
    // process 'work' 
    return work; 
} 

Ou ceci:

- (NSString *) processString: (NSString *) str 
{ 
    NSMutableString *work = [NSMutableString stringWithString: str]; 
    // process 'work' 
    return [NSString stringWithString: work]; // or [work stringValue]? 
} 

Le deuxième fait une autre copie de la chaîne Je retourne, à moins que NSString fait des choses intelligentes comme la copie sur -modifier. Mais le premier renvoie quelque chose que l'appelant pourrait, en théorie, aller modifier plus tard. Je m'en fous s'ils le font, puisque la corde est la leur. Mais y a-t-il des raisons valables de préférer cette dernière forme à la première? Et, est stringWithString ou stringValue préféré par rapport à l'autre?

Répondre

6

Tout dépend de la façon dont vous devez être sur la défensive.

Il n'y a pas de manière raisonnable qu'un client de votre code puisse tester la mutabilité. Ainsi, il n'y a pas de manière raisonnable qu'un client peut passer de NSString à NSMutableString et obtenir soudainement une mutabilité sans avertissement de compilateur de la chaîne. Donc, tant que vous faites confiance à vos clients, vous pouvez aussi retourner la chaîne mutable (comme NSString). Même si le client fait quelque chose de stupide et le mute, les avertissements du compilateur doivent être damnés, rien ne casse.

est importe quand vous renvoyez le magasin de sauvegarde mutable d'un objet qui ne devrait pas être muté extérieurement. Dans ce cas, le client peut ignorer les avertissements du compilateur et/ou les transtyper dans la variante mutable et complètement ignorer votre objet. Ou, plus subtilement, le client pourrait saisir une référence au type de retour supposé immuable et le conserver assez longtemps pour qu'il soit muté plus tard, laissant sa référence dans un état surprenant. Meilleure pratique: Lors du calcul et du renvoi d'une valeur transitoire, la mutabilité est sans importance. Lorsque vous renvoyez une référence à un magasin mutable interne, il est préférable de créer une copie immuable.

Questions connexes