2010-07-29 4 views
0
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) fromDate:[[NSDate alloc] init]]; 

quand j'utilise [components release];libération de mémoire avec alloc

il se bloque ma demande, comment puis-je retirer les composants

quand je lance avec un instrument de fuite - mon application se bloque quand il atteint l'utilisation de 22MB globale alloc

Répondre

2

La méthode NSCalendar components:fromDate: renvoie un objet autoreleased; vous ne devez pas appeler le release dessus (sauf si vous avez d'abord appelé retain).

Vérifiez la Memory Management Rules

3

Vous ne devez pas vous libérer components du tout comme il est mis à AutoRelease par l'objet NSCalendar.

Je soupçonne que votre fuite provient de votre objet NSDate que vous passez à cette ligne de code. Vous devriez probablement assignons à une variable locale, passer à la méthode [cal components] puis relâchez la variable locale:

NSDate *today = [[NSDate alloc] init]; 
NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) 
             fromDate:today]; 
[today release]; 

Ou, définir l'objet NSDate lui-même à AutoRelease que vous passez comme vous le faites, utilisation [NSDate date], qui, comme David Gelhar a commenté va générer un objet autoreleased, comme ceci:

NSDateComponents *components = [cal components:(NSHourCalendarUnit | NSMinuteCalendarUnit | NSSecondCalendarUnit) 
             fromDate:[NSDate date]]; 
+2

Tout à fait; le '[NSDate alloc]' provoque une fuite. Notez qu'au lieu d'utiliser un temp et de le relâcher, vous pouvez également utiliser '[NSDate date]' pour obtenir un objet 'NSDate' autoreleased. –

Questions connexes