2010-07-17 6 views
3

Si j'ai une méthodeNSString * string = @ "someString" vs NSString * string = [[alloc NSString] initWithFormat @ "% @", string]

- (void) myMethod:(NSString *)string { 
    [Object anothermethodWithString:string]; 
} 

et j'appelle

[Object myMethod:@"this is a string with no alloc statement"] 

ai-je besoin de faire quelque chose comme

- (void) myMethod:(NSString *)string { 
    NSString *string2 = [[NSString alloc] initWithFormat:@"%@", string]; 
    [Object anothermethodWithString:string2]; 
    [string2 release]; 
} 

au lieu de la façon dont je l'avais maméthode avant? J'ai un code qui se comporte mal et qui semble provenir d'une chaîne auto-libérée alors qu'une seconde méthode est appelée dans une autre méthode (comme dans l'exemple). La deuxième façon dont myMethod a résolu tous mes problèmes.

Donc, une chaîne "non-alloc" est-elle une chaîne auto-libérée? J'ai posé cette question comme une suite à une autre question (qui était complètement indépendante et c'est pourquoi je crée ce post), et quelques sources ont dit que je n'ai pas besoin de réaffecter la chaîne. Je suis confus, parce que le comportement de mon code me dit le contraire.

+0

Avez-vous invoqué 'new',' alloc', 'retain', ou' copy' pour créer la chaîne? Sinon, vous n'êtes pas responsable de le libérer. Les chaînes constantes ('@" "') sont globales et permanentes. –

+0

Non, je n'ai invoqué aucune de ces méthodes sur la chaîne transmise à myMethod. Ma chaîne @ "" permanente semble être écrasée. –

Répondre

4

Dave tu as trouvé. Vous avez seulement besoin de vous soucier d'appeler release sur les objets que vous new, alloc, retain, ou copy.

La règle ci-dessus fonctionne très bien, mais si vous êtes curieux et que vous voulez entrer dans beaucoup de détails, je vous suggère de lire le Memory management Programming Guide des documents d'Apple. C'est gratuit et va des concepts de base dans beaucoup de détails.

2

Si vous utilisez: NSString * str = @ "". C'est une sorte de constante, vous n'avez pas besoin de gérer la mémoire.

Si vous appelez à partir d'une méthode: NSString * str = [NSString stringWithFormat: @ ""], la str est déjà libérée.

Si vous allouez manuellement, init. Vous devez appeler la libération, ou autorelease vous-même.

La convention de mémoire générale est: si vous faites quelque chose avec le nouveau, alloc, conserver ou copie, vous devez libérer vous-même, tous les autres cas, l'objet est autoreleased, ne relâchez pas

+0

"Si vous utilisez: NSString * str = @" ". C'est une sorte de constante, vous n'avez pas besoin de faire de gestion de la mémoire." Est-ce que ça veut dire que ça pourrait être auto-libéré là où je ne le veux pas? –

+1

@vodkhang Ce n'est pas la règle. La règle est la suivante: si la méthode utilisée pour rendre l'objet contient l'un de 'new',' alloc', 'retain', ou' copy', alors vous devez le 'libérer '. 'init' n'est pas où dans cette liste. Vous devez le relâcher parce que vous l'avez 'alloué', pas parce que vous l'avez initié. –

+1

Les chaînes @ayanonagon créées via '@" "' sont des chaînes constantes et * ne peuvent pas être désallouées. Ils existent dans la section mémoire globale de votre processus et seront là de 'exec' à' exit'. –