2010-10-15 3 views
0

Comment et quand est publié l'objet IndexPath qui est retourné dans UITableViewDelegate?Comment libérer l'objet transmis au protocole ou à la méthode déléguée dans Objective-c?

laisser son code imaginer:

//my method in my object 
{ 
    NSNumber *number=[[NSNumber alloc] init]; 
    number=[[self methodreturningnumber] retain]; 

    [delegate didSelectItemAtIndex:number]; 
} 

dans mon délégué, j'ai méthode:

-(void)didSelectItemAtIndex:(NSNumber *)number 
{ 
} 

lorsque NSNumber objet créé dans la première méthode doit être libéré? Si j'utilise autorelease ou le libère dans la méthode, il ne sera pas accessible dans mon délégué. Si je le laisse comme il est, il peut y avoir une fuite de mémoire

Répondre

4

Il suffit de le libérer après vous appelez la méthode déléguée (ou utilisez autorelease). L'appel de délégué est juste un appel de méthode normale, de sorte qu'il se produit de manière synchrone. (Et si le délégué ne veut pas accrocher à l'objet et l'utiliser plus tard, il appartient au délégué de retain.La règle cardinale de la gestion de la mémoire dans Cocoa est que chaque méthode est responsable de la rétention (et de la libération ultérieure) des objets il doit être conservé.)

Notez également que vous avez une autre fuite de mémoire dans votre exemple: vous êtes alloc nombre, puis vous lui attribuez une autre valeur (fuite de la valeur initiale).

En supposant que methodreturningnumber renvoie un objet autoreleased, vous n'avez pas besoin de gérer la mémoire supplémentaire; juste:

NSNumber *number=[self methodreturningnumber]; 
[delegate didSelectItemAtIndex:number]; 
+0

J'ai changé cela, mais comment conserver cet objet plus tard? J'ai décrit le problème ci-dessous. – plusz

0

Je viens de tester après le changement, cela fonctionne, mais isse apparaît à l'étape suivante si j'essaie d'utiliser cette variable plus tard, elle est perdue.

j'ai changé les noms des objets pour faciliter l'analyse:

//my method in my object OBJ2 
{ 
[delegate didSelectItemAtIndex:[self methodreturningnumber]]; 
} 

dans mon délégué (OBJ1) J'ai méthode:

-(void)didSelectItemAtIndex:(NSNumber *) NSNUMBER 
{ 


SliceDetailsViewController * OBJ2 = [[SliceDetailsViewController alloc] initWithNibName:nil bundle:nil]; 
OBJ2. NSNUMBER = NSNUMBER; //   <---------- THIS IS LOST IF I DON'T ADD RETAIN [NSNUMBER retain] 
OBJ2.pieChart = graphView; 
OBJ2.myColors=myColors; 

[self presentModalViewController:sliceDetailsController animated:YES]; 

[sliceDetailsController release]; 
} 

dans ma fenêtre modale (OBJ3) J'ai méthode qui est appelée à partir de il est sous-vue OBJ4

- (void)colorPicker:(ColorPicker *)myColorPicker didSelectItemAtIndex:(NSNumber *)indexPath 
{ 
[OBJ2 setColor:NSNUMBER value:indexPath];  //  <------ SLICEID IS NOT AVAILABLE HERE IF NOT RETAINED IN PREVIOUS OBJECT 

} 

OBJ4 appelle cette méthode ci-dessus:

[delegate colorPicker:self didSelectItemAtIndex:atrribute]; 

........... méthodes appelées à partir d'objets sont: OBJ1 -> OBJ2 -> OBJ1 -> OBJ3 -> OBJ4 -> OBJ3

OBJ1 appel OBJ2 (en passant soi comme délégué) OBJ2 génère NSNumber X et un procédé d'appel de OBJ1 avec NSNumber X

OBJ1 appel comme presentModalViewController OBJ3 et définit X comme l'un des attributs de OBJ3

OBJ3 est affiché correctement et peut accéder NSNumberX

OBJ3 VievController classe sous-vue OBJ4 (vue sur la même écran)

lorsque je clique sur OBJ4 il appelle la méthode de OBJ3 sans arguments et OBJ3 a l'adresse de NSNumber, mais il est hors de portée.

..........

+0

Je me demande si la méthode initiale où je crée un objet peut avoir un impact sur ceci: NSNumber * numSliceId = [[NSNumber alloc] init]; numSliceId = [NSNumber numberWithFloat: 12345]; return [numSliceId autorelease]; – plusz

Questions connexes