Приложение показывает утечку в инструменте, что не так с этим простым кодом? - PullRequest
0 голосов
/ 04 декабря 2011

Я просто экспортирую свои данные в файл CSV.Но когда я нажимаю кнопку «Экспорт», прибор Leak показывает ошибку [NSPlaceholderMutableString init].

Я не использовал Placeholder где-либо в моем NSMutableString, тогда что такого плохого в том, что прибор показывает утечку.

Вот мой код:

- (IBAction)btnExportDataPressed:(id)sender
{
    csvString = [[NSMutableString alloc] init];
    csvString = [NSMutableString stringWithFormat:@"No.,Name,Type,MaskPAN,SwipeTime\n"];
    NSString *msg = @"";

    if (self.totalCards.count>0)
    {
        for (int i=0; i<self.totalCards.count; i++)
        {
            self.cardInfo = [self.totalCards objectAtIndex:i];
            [csvString appendString:[NSMutableString stringWithFormat:@"%d,%@ %@,%@,%@,%@\n",i+1,self.cardInfo.firstName,self.cardInfo.lastName,self.cardInfo.type,self.cardInfo.maskedPAN,self.cardInfo.swipeTime]];
        }
        NSLog(@"csvString:%@",csvString);

        NSFileManager *fileManager = [NSFileManager defaultManager];
        NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
        NSString *documentsDirectory = [paths objectAtIndex:0];
        NSString *fileName = [NSString stringWithFormat:@"ORANGE_BOWL_%@",[NSDate date]];

        NSString *fullPath = [documentsDirectory stringByAppendingPathComponent:[NSString stringWithFormat:@"%@.csv",fileName]];
        [fileManager createFileAtPath:fullPath contents:[csvString dataUsingEncoding:NSUTF8StringEncoding] attributes:nil];
        msg = @"Data exported successfully. Connect the device to iTunes to get the records.";
    }
    else
    {
        msg = @"No Data to Export";
    }

    [csvString release];        
    UIAlertView *alert = [[UIAlertView alloc] initWithTitle:@"Discover Orange Bowl," message:msg delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil, nil];
    [alert show];
    [alert release];
}

Ниже приведено изображение ошибки с прибора

enter image description here

Ответы [ 3 ]

2 голосов
/ 04 декабря 2011

В верхней части кода есть утечка памяти:

csvString = [[NSMutableString alloc] init];
csvString = [NSMutableString stringWithFormat:@"No.,Name,Type,MaskPAN,SwipeTime\n"];

Таким образом, вы выделяете память для изменяемой строки (строка 1), которая увеличивает количество сохраняемых данных на 1, а затем в строке2 вы теряете ссылку на указатель на это, потому что вы назначаете другую строку для указателя.Это наверняка утечет память;не уверен, что остальная часть вашего кода делает что-то плохое.

Поэтому удалите первую строку - это бесполезно и служит только для утечки памяти.

Кроме того, ваш [csvString release]строка выглядит неправильно, потому что когда вы в последний раз присваивали что-то csvstring, вы использовали [NSMutableString stringWithFormat], что не увеличивает счет сохранения (и, следовательно, вы не должны уменьшать его с помощью release).Поэтому попробуйте удалить строку с надписью [csvString release];.

Инструмент «Утечки» может показывать слегка сбивающие с толку ссылки на объект, который вы на самом деле не использовали;это вызвано тем, что эти объекты используются внутренне объектами, которые вы использовали (и утечка).

0 голосов
/ 04 декабря 2011

Вы не должны звонить alloc, init и release на csvString, если вы инициализируете его с stringWithFormat:

Методы init и stringWithFormat: описаны в документации NSString в разделе Создание и инициализация строк . Вы должны выбрать один или другой, а не оба. В этом случае вы, вероятно, просто хотите пойти с stringWithFormat:.

Вы должны прочитать Управление памятью Objective-C , но общее правило здесь таково: если метод, который вы используете для создания объекта, начинается с init, тогда вы используете alloc и release. Если метод не начинается с init, то вы не используете alloc и release.

0 голосов
/ 04 декабря 2011

Изменение

csvString = [NSMutableString stringWithFormat:@"No.,Name,Type,MaskPAN,SwipeTime\n"];

К

[csvString appendFormat:@"No.,Name,Type,MaskPAN,SwipeTime\n"];

...