2009-08-21 6 views
1

J'ai un NSString et je veux écrire sa valeur à un NSMutableString. Est-ce valable:Cocoa String Question

NSString *temp = [NSString stringWithString:@"test"]; 
NSMutableString *mutable = temp; 

Je demande parce que même si cela semble faisable, je pense que cela Affectez les deux température et mutable au même espace d'adressage. J'ai beaucoup de questions lors de la transmission de valeurs dans une méthode ou du renvoi de valeurs à partir d'une méthode. Parfois, je vois d'autres personnes le faire ou créer la chaîne mutable avec stringWithString ou initWithString. Merci

Répondre

10

Vous pouvez utiliser la méthode mutableCopy, ce qui crée une copie mutable du récepteur et applique à toute classe qui adopte le protocole NSMutableCopying (dont NSString est l'un d'entre eux):

NSString *temp = [NSString stringWithString:@"test"]; 
NSMutableString *mutable = [temp mutableCopy]; 

Cela va créer une copie mutable de la chaîne, en tant que nouvelle instance de chaîne. Dans ce cas, cela ne s'applique pas, car temp est une chaîne auto-libérée, mais vous auriez autrement besoin de libérer l'ancienne chaîne dont vous avez fait une copie, si vous n'en avez plus besoin.

Depuis mutableCopy contient "copie", alors vous devez gérer la mémoire de la nouvelle chaîne (vous en prenez possession en fonction de l'Apple Object Ownership Policy).

La méthode que vous avez utilisée attribue simplement mutable en tant que pointeur au NSString précédemment instancié.

5

Une chose qui semble confondre beaucoup de gens avec Cocoa est la différence entre les variables et les objets.

Vous devez garder à l'esprit que lorsque vous déclarez une variable comme NSMutableString *mutable, , vous ne créez pas une chaîne. Ceci est juste une variable pointeur de type NSMutableString*. Structurellement, c'est la même chose que n'importe quel autre pointeur - et, comme l'indique le terme «pointeur», il pointe simplement vers quelque chose qui vit ailleurs. Pour cette raison, techniquement, vous pouvez l'assigner à un objet. Mais vous ne transformez pas cet objet en une chaîne mutable - vous ne faites que mentir sur le type d'objet sur lequel pointe la variable. Une fois que vous essayez d'envoyer à l'objet un message que seul NSMutableString peut répondre, le jig est en hausse! Comme Perspx l'a dit, si vous avez une chaîne que vous voulez muter, vous pouvez utiliser la méthode mutableCopy pour obtenir - vous l'aurez deviné - une copie mutable. Il existe également de nombreuses méthodes NSString qui ne modifient pas la chaîne, mais vous permettent d'obtenir une nouvelle chaîne avec certaines modifications apportées (par exemple, stringByAppendingString:). Vous pouvez aller assez loin avec ceux-là.

Questions connexes