2013-04-29 125 views
1

我想通过MfMail Composer发送一个CSV文件。一切正常,但使用Instruments时出现很多泄漏。我无法找到我出错的地方。这里是我的代码。使用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]; 
} 

回答

0

我不能说我看到你提供的代码中的任何东西都会导致你泄漏。你的泄漏可能发生在别处。

我所看到的,然而,在-getCSV创建在循环自动释放的对象很多的潜力,这取决于您要执行多少次迭代,这可能是几乎一样糟糕。按照您写它的方式,我会看到一个日期格式化程序和三个字符串,每次迭代都会前往主自动释放池。一个建议是在你的循环之外创建一个日期格式化器,你可以在其中重用。另一个建议是用本地自动释放池构建循环的内核;这将防止你的主autorelease池变得太大。

没有任何意思,你也应该考虑使用快速枚举。

这是你的循环应用了建议:

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

感谢suggestions.And是的,我只是删除了代码和检查,内存泄漏仍然看完,你在哪里任何想法,这些泄漏都不可能是...因为我一旦发送邮件就会发生这些泄漏。 – ichanduu 2013-04-29 15:12:57

+0

@Chandubhai如果没有看到更多的代码,我很难说。我能想到的唯一问题是:你在使用'-getCSV'返回的那个'NSData'实例做什么?我的意思是,就“-displayComposerSheet”而言,我可以看到你在做什么。你能否以某种方式将它保留在其他地方,并且无法释放它? – trudyscousin 2013-04-29 15:18:16

+0

不,这是我使用它的唯一方法。 – ichanduu 2013-04-29 15:28:52