2013-04-29 62 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