2010-09-05 5 views
0

J'ai tellement joué avec ObjC que je me sens perdu en ce qui concerne "autoreleasing".Autorelease et NSString dans Objective C

dans mon .h:

NSString *sAStringMember; 

dans mon .m:

-(void) createAString 
{ 
NSString *sAString = [NSString stringWithString:[dummyCode...get String ffrom some input field for instance]]; 
sAStringMember = sAString; 
} 

Plusieurs questions courtes:

  1. Dans "createAString:" une chaîne autoreleased "sAString" est créé. Si sAString est autoeleased (quand est-ce que cela se produira?), Mon membre "sAStringMember" pointera vers une adresse invalide, correct?

  2. Si l'hypothèse ci-dessus est correcte, serait-ce une option de libérer sAStringMember avant de lui affecter sAString, puis de le conserver?

  3. Meilleur serait utiliser "copier" pour copier sAString à sAStringMember je suppose?

René

Répondre

2

(1) Oui.
(3) Soit -retain soit -copy est correct.

Le meilleur utiliserait la propriété déclarée.

@interface Foo : ... { 
    NSString* sAStringMember; 
} 
@property(copy) NSString* sAStringMember; // or retain. 
@end 
... 
@implementation Foo 
@synthesize sAStringMember; 
... 
-(void) createAString { 
    self.sAStringMember = [dummyCode...get String ffrom some input field for instance]; 
} 
-(void)dealloc { 
    ... 
    [sAStringMember release]; 
    [super dealloc]; 
} 
@end 

(Aussi, s'il vous plaît éviter la notation hongroise.)

+0

Merci. Quel est le problème avec la notation hongroise? – Krumelur

0

Oui si vous gardez un pointeur vers un objet d'un autre endroit et gardez-vous toujours de copier ou de le conserver. La conservation est préférable sauf si vous souhaitez la modifier car elle n'alloue pas de mémoire supplémentaire et est plus rapide.

Pour votre question au sujet de la sortie de la chaîne, la seule réponse possible est: parfois après le retour de votre fonction.

Dans de nombreux livres, vous pouvez lire que cela se produira lorsque l'événement GUI suivant est traité, mais ce n'est pas certain. Dans la séquence d'appel de fonction, chaque fonction peut ouvrir et fermer son propre pool d'autorelease.

Si une fonction fait beaucoup de travail, elle peut simplement créer son pool de libération automatique et libérer les objets enregistrés par autorelease à chaque fois qu'elle le fera.