2009-10-08 8 views
0

Je personnalisation des lignes d'un UIPickerView, donc je suis mise en œuvre de la méthode viewForRow dans elle est délégué comme suit:Cocoa-Touch: gestion de la mémoire

- (UIView *)pickerView:(UIPickerView *)pickerView viewForRow:(NSInteger)row forComponent:(NSInteger)component reusingView:(UIView *)view { 
    if (view) { 
     return view; 
    } else { 
     NSString *s = [datePickerValues objectAtIndex:row]; 

     UILabel *l = [[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 44)]; 
     l.text = s; 
     l.font = [UIFont boldSystemFontOfSize:18]; 
     l.textAlignment = UITextAlignmentCenter; 
     l.backgroundColor = [UIColor purpleColor]; 

     [l autorelease]; 
     return l; 
    }  
} 

Je suis nouveau à Obj-C.

Depuis que je suis aloc/initing l, je suis supposé le libérer aussi selon le guide de gestion de la mémoire. Cependant, je dois aussi le retourner. Est autoreleasing-il OK?

+0

Vous pouvez raser une ligne de votre code avec return [l autorelease]; – pxl

+0

Soit cela ou amoindrir la autorelease dans le cadre de l'alloc/init – Lounges

Répondre

10

Oui autoreleasing est exactement ici.

+0

En fait, c'est exactement ce cas d'utilisation qui a motivé l'invention de 'NSAutoreleasePool'. –

3

Je pense que la convention est de AutoRelease dans la déclaration alloc:

UILabel *l = [[[UILabel alloc] initWithFrame:CGRectMake(0, 0, 300, 44)] autorelease]; 

Puisque vous avez besoin l'objet d'exister après la sortie de la méthode, vous avez pas d'autre choix que d'utiliser autorelease. En règle générale, vous devez vous assurer dans la méthode d'appel que vous en gardez une copie, sinon elle pourrait être publiée sur vous de manière aléatoire. Dans ce cas, le pickerView le fait pour vous, donc pas de soucis.

Questions connexes