2010-09-09 6 views
1

Bonjour les membres de la famille Stackoverflow!Gestion de la mémoire de l'iPhone

J'ai une question concernant la gestion de la mémoire dans l'iPhone.

Ce que je ne comprenais était en dessous de la méthode

-(void) dealloc 
{ 
    // something else to release whatever 
    // such as Object Created using keyword 'alloc' 
    // but also Object destroy here its retain value reaches iff 0 
    // if I do put here NSLog(@"%d", [obj retainCount]); and when it reaches 
    // not equal to 0 means failure with memory leak. 
    [super dealloc]; 
} 

Alors suis-je comprends bien? ou Il est encore allumé même si retenir nombre portée> 0 ici?

La raison pour laquelle je demande à cette question parce que,

J'ai vérifié avec

NSLog(@"%d", obj.retainCount); 

pour vérifier le nombre de conserver l'objet et reçu la valeur 3. J'ai donc essayé de libérer ici 3 fois pour faire retainCount ici égal à 0, mais le compilateur me donne une erreur critique.

S'il vous plaît, je suis nouveau à la désaffectation de la mémoire et conserver, libérer.

objet que j'ai utilisé était l'objet 'UIImageView' et a créé une autre instance que,

UIImageView *imageView = //da da~ with UIImage 
UIImageView *instance; 
// at this point retain count was '1' 
instance = imageView; 
//[imageView retain]; 
// at this point retain count was '2' 
[self.view addSubView: imageView]; 
// at this point retain count was '3' 
[imageView release];// crashes 
// at this point retain count was '2' 

mais si je

// but if I add retain on the 'instance = imageView' 
// such as 
instance = imageView; // then 
[imageView retain]; 
// works but still count is 2... 

Merci.

Répondre

1

Le processus normal pour surcharger dealloc est de libérer tous les objets qui ont été précédemment conservés (ou alloués) par cette instance.

Donc, si quelque part ailleurs dans l'objet que vous avez appelé alloc ou conserver votre méthode dealloc ressemblerait à ceci:

-(void)someOtherMethod 
{ 
    UIImageView *imageView = //da da~ with UIImage 
    UIImageView *instance; 
    instance = imageView; 
    [instance retain]; 
} 

-(void) dealloc 
{ 
    //release any retained objects here 
    [instance release]   
    [super dealloc]; 
} 

Notez qu'il n'a pas d'importance si le compte de libération n'a pas chuté à zéro après votre version particulière, cela signifie simplement qu'un autre bit de code a également retenu la mémoire de l'objet (et que l'autre bit de code sera responsable de sa libération).

Espérons que cela aide.

5

retainCount est pas un débogage outil fiable:

  • autres objets peuvent encore tenir les références à obj
  • il y a des objets que vous ne pouvez pas détruire (par exemple string constants)
  • objets
  • sont DEALLOCATED si publié avec un nombre de retenue de 1

Ce que vous devez prendre en charge à la place:

  • références d'équilibrage que vous avez avec la bonne quantité de release/autorelease
  • utilisant le Analyzer
  • utilisant Leaks
0

Ce n'est pas correct et vous devriez rarement utiliser retainCount. Il ne doit pas être 0 à ce stade car d'autres objets pourraient avoir des références aux objets que vous libérez. Ce qu'il est important de faire dans dealloc est de libérer les objets dont vous êtes propriétaire. Ce qui serait des objets créés avec alloc ou new