1

MfMail Composer を介して CSV ファイルを送信しようとしています。すべて正常に動作しますが、Instruments の使用中に多くのリークが発生します。どこに問題があったかを追跡できません。コードは次のとおりです。

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

1 に答える 1

0

あなたが提供したコードに、リークの原因となるものがあるとは言えません。リークは他の場所で発生している可能性があります。

ただし、私が見ているのは、そのループで多くの自動解放されたオブジェクトを作成する可能性が-getCSVあり、実行している反復の数によっては、それがほとんど悪い可能性があることです。あなたが書いたように、日付フォーマッターと、反復ごとにメインの自動解放プールに向かう 3 つの文字列が表示されます。1 つの提案は、ループ内で再利用できる日付フォーマッターをループの外に作成することです。もう 1 つの提案は、ループの根幹をローカルの自動解放プールで構成することです。これにより、メインの自動解放プールが大きくなりすぎるのを防ぐことができます。

当然のことながら、高速列挙の使用も検討する必要があります。

提案が適用されたループは次のとおりです。

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];
}
于 2013-04-29T14:54:50.223 に答える