2013-04-29 1 views
1

J'essaie d'envoyer un fichier CSV via MfMail Composer.Tout fonctionne très bien, mais il y a beaucoup de fuites lors de l'utilisation d'Instruments.I ne suis pas capable de tracer où je me suis trompé.Voici mon code.Fuites de mémoire lors de l'utilisation MFMailComposer

-(NSData *)getCSV 
{ 
NSManagedObjectContext *moc = [(ETAppDelegate *)[[UIApplication sharedApplication] delegate]managedObjectContext]; 
NSFetchRequest *request = [[[NSFetchRequest alloc]init]autorelease]; 
[request setEntity:[NSEntityDescription entityForName:@"Expense" inManagedObjectContext:moc]]; 
NSError *error = nil; 
NSArray *results = [moc executeFetchRequest:request error:&error]; 
NSMutableArray *expensesList = [[[NSMutableArray alloc]init]autorelease]; 
for(int i = 0;i<[results count];i++){ 
    NSString *category = [[results objectAtIndex:i]valueForKey:@"category"]; 
    NSString *date = [[NSDateFormatter dateFormatterwithMediumStyle]stringFromDate:[[results objectAtIndex:i]valueForKey:@"date"]]; 
    NSString *amount = [NSNumberFormatter localizedStringFromNumber:[[results objectAtIndex:i]valueForKey:@"amount"] numberStyle:NSNumberFormatterCurrencyStyle]; 
    NSString *mailString = [NSString stringWithFormat:@"%@,%@,%@",category,date,amount ]; 
    [expensesList addObject:mailString]; 
} 
NSString *expensesString = [expensesList componentsJoinedByString:@"\n"]; 
NSData *expensesData = [expensesString dataUsingEncoding:NSUTF8StringEncoding]; 
return expensesData; 
} 


-(void)displayComposerSheet 
{ 
NSData *csvFile = [self getCSV]; 
NSString *csvFileName = @"MyExpenses"; 
MFMailComposeViewController *mailController = [[MFMailComposeViewController alloc]init]; 
[mailController setSubject:@"List Of Expenses"]; 
[mailController setMessageBody:@"Expenses" isHTML:NO]; 
[mailController addAttachmentData:csvFile mimeType:@"text/csv" fileName:csvFileName]; 
[mailController setMailComposeDelegate:self]; 
[self presentModalViewController:mailController animated:YES]; 
[mailController release]; 
} 

Répondre

0

Je ne peux pas dire que je vois quelque chose dans le code que vous avez fourni qui devrait vous causer une fuite. Vos fuites ont probablement lieu ailleurs.

Ce que je ne vois, cependant, est le potentiel de créer beaucoup d'objets autoreleased dans cette boucle en -getCSV, et selon le nombre d'itérations que vous effectuez, cela pourrait être presque aussi mauvais. La façon dont vous l'avez écrit, je vois un formateur de date et trois chaînes pour votre piscine autorelease principale à chaque itération. Une suggestion est de créer un formateur de date en dehors de votre boucle que vous pouvez réutiliser à l'intérieur. Une autre suggestion consiste à encadrer les tripes de votre boucle avec un pool autorelease local; Cela empêchera votre pool autorelease principal de devenir trop grand.

À propos de rien, vous devriez également envisager d'utiliser un dénombrement rapide.

Voici votre boucle avec les suggestions appliquées:

NSDateFormatter *myDateFormatter = [NSDateFormatter dateFormatterWithMediumStyle]; 

NSMutableArray *expensesList = [[[NSMutableArray alloc] init] autorelease]; 
for (id obj in results) 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    NSString *category = [obj valueForKey:@"category"]; 
    NSString *date = [myDateFormatter stringFromDate:[obj valueForKey:@"date"]]; 
    NSString *amount = [NSNumberFormatter localizedStringFromNumber:[obj valueForKey:@"amount"] numberStyle:NSNumberFormatterCurrencyStyle]; 
    NSString *mailString = [NSString stringWithFormat:@"%@,%@,%@", category, date, amount]; 

    [expensesList addObject:mailString]; 

    [pool release]; 
} 
+0

merci pour le suggestions.And oui je viens enlevé le code et les fuites de vérifier et de mémoire sont toujours vous there.do une idée sur l'endroit où ces fuites peuvent éventuellement être ... parce que je reçois ces fuites une fois le courrier envoyé. – ichanduu

+0

@Chandubhai Sans voir plus de votre code, il serait difficile pour moi de le dire. La seule question que je peux penser est: Que faites-vous avec cette instance de 'NSData' vous revenez de' -getCSV'? Je veux dire, je peux voir ce que tu fais avec ça en ce qui concerne '-displayComposerSheet '. Pourriez-vous le conserver ailleurs et ne pas le relâcher? – trudyscousin

+0

Non c'est la seule méthode dans laquelle je l'utilise. – ichanduu