2010-11-27 16 views
0

L'allocation de NSDateFormatter (ou NSNumberFormatter) est relativement lente et
cellForRowAtIndexPath s'exécute pour chaque cellule. Par conséquent, l'allocation de formateurs dans cellForRowAtIndexPath peut être un contributeur important au défilement saccadé.Comment cellForRowAtIndexPath peut-il réutiliser les formateurs (pour améliorer le défilement)?

Pour lisser le défilement, je les ai essayé l'allocation en dehors cellForRowAtIndexPath,
en les rendant une variable de classe et les attribuer à viewWillAppear et en les libérant dans viewWillDisappear (voir code ci-dessous).
Mais cela produit des fuites dans les formateurs.

Où est le meilleur endroit pour déclarer/allouer/libérer des formateurs utilisés dans cellForRowAtIndexPath?

//in myNavigationViewController.m: 
NSDateFormatter *myDateFormatter;        

-...viewWillAppear...{      
    if(myDateFormatter){     //Solution: add this check. 
     [myDateFormatter release]; 
    } 
    myDateFormatter = [[NSDateFormatter alloc] init];       
    [myDateFormatter setDateStyle:NSDateFormatterShortStyle]; 
    [myDateFormatter setTimeStyle:NSDateFormatterShortStyle]; 
    if(locale){        //Solution: add this check. 
     [locale release]; 
    } 
    locale = [NSLocale currentLocale]; 
    [myDateFormatter setLocale:locale];  
} 
-...cellForRowAtIndexPath... { 
    cell.myDateLabel.text = [myDateFormatter stringFromDate:_date];    
} 

-...viewWillDisappear...{ 
// [myDateFormatter release];    //Solution: remove this line 
} 
-...dealloc { 
    [myDateFormatter release];    //Solution: add these 2 lines. 
    [locale release]; 
} 

Répondre

1

Il ne faut pas fuir tout aussi longtemps que vous vous souvenez de désaffecter dans -dealloc.

+0

Merci. Corrigé par a) en supprimant la version de viewWillDisappear, b) en ajoutant -dealloc, c) en vérifiant myDateFormatter à viewWillAppear, et d) en faisant de même pour 'locale'. J'ai posté la 'Solution' dans le code ci-dessus. Merci beaucoup! – sambaMan