2010-07-28 2 views

Répondre

0

Au lieu d'utiliser un double pointeur, ne serait-il pas plus élégant d'utiliser un NSMutableString à la place?

- (void)createAString:(NSMutableString *)str 
{ 
    [str setString:@"Hi all!"]; 
} 

....

NSMutableString *createStr = [[NSMutableString alloc] init]; 
[self createAString: createStr]; 
NSLog(@"%@", createStr); 
[createStr release]; 

Ou, encore mieux, tout simplement avoir la méthode createAString retourner un NSString.

- (NSString *)createAString 
{ 
    return @"Hi all!"; // this is autoreleased automatically 
} 

Je ne voudrais pas supposer que vos besoins soient aussi simples. =)

+0

Merci pour votre réponse ... mais comme je l'ai mentionné je ne veux pas créer l'instance en dehors de la fonction, parce que je n'en ai pas besoin tout le temps! mes besoins d'origine sont d'utiliser la fonctionnalité que j'ai demandée dans une fonction comme '- (int) terminalExec: (NSString *) arguments execPath: (NSArray *) args sortie: (NSString **) outString' où il exécute une tâche dans un terminal et retourne l'état (int) de l'exécution ET la sortie du terminal dont j'ai parfois besoin. alors ... pas si simple besoin :) Merci encore! –

+0

Ce n'est pas vraiment plus élégant IMO. Demander à l'appelant de créer un objet modifiable pour vous est un peu hackish et n'est généralement pas fait. – Chuck

+0

Non, il serait plus élégant de tirer parti du fait qu'une méthode peut retourner une valeur et l'utiliser pour retourner la chaîne requise. – JeremyP

2

Vous avez raison de dire que vous voudriez généralement renvoyer des objets auto-libérés (ou similaires) à partir de params lorsque vous utilisez ce formulaire. Votre déclaration d'affectation dans la fonction qui définit *str à une chaîne:

*str = [NSString stringWithString:@"foo"]; 

fait déjà la bonne chose, car cette méthode retourne une instance de NSString que l'appelant ne possède pas. Tout comme vous pouvez renvoyer cet objet chaîne à partir de votre fonction sans aucune autre gestion de la mémoire, vous pouvez le définir comme outparam comme vous l'avez fait. Votre deuxième extrait montrant le site d'appel est correct.


Cela dit, je suis inquiet pour quelques choses dans votre code que vous devez être sûr que vous comprenez:

  1. La valeur de str dans la méthode est encore **, et l'envoi qu'un message (comme vous l'avez fait pour le autorelease) est un non-sens. Assurez-vous de bien comprendre les pointeurs indirects avant de les utiliser trop généreusement. :) Si vous devez envoyer str un message après l'avoir créé, envoyez-le à *str, qui contient le NSString *.

  2. Définir un outparam comme ceci lorsque la fonction renvoie void n'est pas un cacao idiomatique. Vous devez normalement renvoyer le NSString * directement. Les outparams sont rares dans le cacao. (En général, seulement NSError s obtenir ce traitement du cadre appelle. Sinon, ils les utilisent pour différencier le nom comme getString classique à partir accesseurs normales get qui n'utilisent pas le mot « get ».)

  3. J'espère que -stringWithString était juste un exemple . Cette méthode n'est presque jamais utilisée dans la pratique, car il est équivalent (dans ce cas) à l'utilisation d'un @"string literal" (bien que cela nuise à votre exemple).

+0

Merci pour votre réponse !! que '[autorelease];' a été mal orthographié :) bien sûr, il est '[str autorelease];' J'utilise une fonction pour retourner plus d'une chose: '- (int) terminalExec: (NSString *) arguments execPath: (NSArray *) args sortie: (NSString **) outString' et parfois je veux la sortie de la tâche (terminal); parfois non! J'étais juste confus avec des problèmes de publication. Généralement ... si l'appelant possède l'instance, disons avec '... = [[NSString alloc] init] comment dois-je utiliser release/autorelease ?? encore merci! –

+0

Que voulez-vous dire exactement par "si l'appelant possède l'instance"? Que faites-vous avec cette instance? –

+0

Vous devriez le "libérer" explicitement, à l'intérieur de la méthode, car vous ne l'utiliserez plus après avoir passé une référence à 'stringWithString'. Les règles habituelles s'appliquent: si vous l'allouez/initez, relâchez-le ou autoreleasez-le. Mais encore une fois, n'utilisez pas stringWithString ici. Cela ne réalise rien pour vous. –

Questions connexes