Iphone 使用MFMailComposer时内存泄漏

Iphone 使用MFMailComposer时内存泄漏,iphone,ios,objective-c,xcode,mfmailcomposeviewcontroller,Iphone,Ios,Objective C,Xcode,Mfmailcomposeviewcontroller,我正试图通过MfMail Composer发送CSV文件。一切正常,但在使用仪器时有很多泄漏。我无法找出哪里出了问题。这是我的代码 -(NSData *)getCSV { NSManagedObjectContext *moc = [(ETAppDelegate *)[[UIApplication sharedApplication] delegate]managedObjectContext]; NSFetchRequest *request = [[[NSFetchRequest alloc

我正试图通过MfMail Composer发送CSV文件。一切正常,但在使用仪器时有很多泄漏。我无法找出哪里出了问题。这是我的代码

-(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];
 }
-(NSData*)getCSV
{
NSManagedObjectContext*moc=[(ETAppDelegate*)[[UIApplication sharedApplication]委托]managedObjectContext];
NSFetchRequest*request=[[[NSFetchRequest alloc]init]autorelease];
[请求集合实体:[NSEntityDescription entityForName:@“Expense”在托管对象上下文中:moc]];
n错误*错误=nil;
NSArray*结果=[moc executeFetchRequest:请求错误:&错误];
NSMutableArray*expensesList=[[NSMutableArray alloc]init]autorelease];

对于(int i=0;i我不能说我在您提供的代码中看到了任何可能导致您泄漏的内容。您的泄漏可能发生在其他地方

然而,我确实看到了在
-getCSV
中的循环中创建大量自动删除对象的可能性,这取决于您执行的迭代次数,这几乎是一样糟糕的。按照您编写它的方式,我看到每次迭代都有一个日期格式化程序和三个字符串指向您的主自动删除池。一个建议在循环外部创建一个日期格式化程序,可以在循环内部重用。另一个建议是使用本地自动释放池来构建循环的核心;这将防止主自动释放池变得太大

没有任何东西,你也应该考虑使用快速枚举。< /P> 下面是您的循环,其中包含应用的建议:

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];
}

谢谢你的建议。是的,我刚刚删除了代码并进行了检查,内存泄漏仍然存在。你知道这些泄漏可能在哪里吗……因为我在邮件发送后就收到了这些泄漏。@Chandubai如果没有看到你的更多代码,我就很难说了。我能想到的唯一问题是:什么你在处理从
-getCSV
返回的
NSData
实例吗?我的意思是,我可以看到你在用它做什么,就“-displayComposer Sheet”而言。你能不能以某种方式将它保留在其他地方,但无法释放它?不,这是我使用它的唯一方法。@Chandubai你说泄漏发生在之后r您发送邮件。该区域发生了什么?(正如我前面提到的,查看更多代码可能会有所帮助。)