2013-04-29 2 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 풀로 향하는 날짜 포맷터와 세 개의 문자열을 보았다. 한 가지 제안은 내부에서 다시 사용할 수있는 루프 외부에 날짜 포맷터를 만드는 것입니다. 또 다른 제안은 로컬 autorelease 풀을 사용하여 루프의 내장을 구성하는 것입니다. 그것은 메인 autorelease 수영장이 너무 커지지 않도록 방지합니다.

아무 것도 제시하지 않으면 빠른 열거 형을 사용하는 것도 고려해야합니다. suggestions.And에 대한

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

덕분에 그래 난 그냥 코드를 제거하고 확인하고 메모리 누수는 여전히 당신이 누출 가능성이 수에 대해 어떤 생각을 there.do됩니다

다음은 제안을 적용하여 루프의 나는 메일이 보내지면 누출이 생기기 때문에. – ichanduu

+0

@Chandubhai 코드를 더 이상 보지 않으면 말하기가 어려울 것입니다. 내가 생각할 수있는 유일한 질문은 :'-getCSV'에서 리턴하는'NSData'의 인스턴스로 무엇을하고 있습니까? 제 말은,'-displayComposerSheet '에 관한 한 당신이 뭘하는지 볼 수 있습니다. 여하튼 어딘가에 다른 곳에 보관할 수 있습니까? – trudyscousin

+0

그게 유일한 방법은 내가 그것을 사용하고 있습니다. – ichanduu