проблема в выпуске nsstring - PullRequest
0 голосов
/ 30 марта 2011

У меня проблема, когда я освобождаю data22, возникает исключение, и когда я комментирую эту строку, они не являются ошибкой.в чем причина.

NSString *data22=[[NSString alloc] init];
data22=@"";
 for (int i=0;i<[emailData count] ; i++) {
    NSString *csv =[NSString stringWithFormat:@"\"%@\",\"%@\"",[[emailData objectAtIndex:i] keyword],[[emailData objectAtIndex:i] note]];
     data22=[NSString stringWithFormat:@"%@%@",data22,csv];
     if(i<[emailData count]-1)
          data22=[NSString stringWithFormat:@"%@\n",data22,csv];


 }

[@"" writeToFile:toPath atomically:YES];
NSFileHandle *writeHandle=[NSFileHandle fileHandleForWritingAtPath:toPath] ;
[writeHandle writeData:[data22 dataUsingEncoding:NSUTF8StringEncoding]];

когда я пишу эту строку кода, то после завершения этого метода возникает исключение

 [data22 release];

оставшийся метод

        MFMailComposeViewController *picker = [[MFMailComposeViewController alloc] init];
    picker.mailComposeDelegate = self;

    [picker setSubject:@"AKW Keywords"];

    picker.navigationBar.barStyle = UIBarStyleBlack;  //  Translucent  UIBarStyleBlack;

    // Set up recipients
NSData *myData2 =[NSData dataWithContentsOfFile:toPath];
[picker addAttachmentData:myData2 mimeType:@"text/csv" fileName:@"awk.csv"];

// Fill out the email body text
NSString *emailBody = @"";
[picker setMessageBody:emailBody isHTML:NO];

[self presentModalViewController:picker animated:YES];
[picker release];
NSLog(@"after release");
}

Ответы [ 2 ]

2 голосов
/ 30 марта 2011

Строка, возвращаемая с stringWithFormat, не принадлежит вашему коду, если вы не сохраните ее явно. Вы не должны выпускать объекты, которые вам не принадлежат.

Это разница между использованием [NSString stringWithFormat: ...] и [[NSString alloc] initWithFormat: ...]; stringWithFormat возвращает объект, который был запланирован для освобождения. Если вы не сохраните это, этот релиз избавится от него. initWithFormat возвращает объект с эффективным счетом сохранения 1; от вас зависит избавиться от него.

Предполагая, что это все в одном методе, вы можете исправить это, не вызывая release для строки. Тем не менее, это предполагает кучу вещей, которые могут быть или не быть правдой вашего кода. Вам действительно нужно прочитать документацию Apple по управлению памятью: Руководство по программированию управления памятью . Это несколько страниц, которые охватывают как правила, так и несколько простых примеров их использования.

1 голос
/ 30 марта 2011

Вызов stringWithFormat достаточно, чтобы получить действительный строковый объект, который вы можете использовать, но впоследствии вы не должны освобождать его, потому что вы его не создали (используя alloc).Если вы хотите передать строку какой-либо другой функции, сохраните ее и отпустите в этой другой функции, как только закончите с ней.

Кроме того, вы вызываете утечку памяти, сначала вызывая alloc для data22,затем вызывая stringWithFormat и снова назначая объект data22, не выпуская сначала старый объект.

EDIT: просто удалите этот

NSString *data22=[[NSString alloc] init];
data22=@"";

и замените его на

NSString* data22;

и это будет работать, если вы будете использовать только функцию stringWithFormat.Вам никогда не придется публиковать данные22 таким образом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...