Утечка памяти при копировании NSString - PullRequest
1 голос
/ 07 апреля 2011

У меня есть приложение, которое использует библиотеку TouchJSON target-C, и я запускаю профилировщик Instruments для утечек памяти и утечек в том источнике, которые я не могу понять, как исправить. Я должен упомянуть, что я довольно плохо знаком с Какао и целью-C. Instruments показывает, что утечка происходит в методе со следующей подписью:

- (BOOL)scanJSONStringConstant:(NSString **)outStringConstant error:(NSError **)outError

... и утечка происходит именно в этом блоке кода:

if (self.options & kJSONScannerOptions_MutableLeaves)
{
     *outStringConstant = [theString autorelease];
}
else
{
    *outStringConstant = [[theString copy] autorelease];   //LEAK IS HAPPENING HERE
    [theString release];
}

Я пробовал множество исправлений, чтобы попытаться избавиться от утечки, но безуспешно. Может ли кто-нибудь, пожалуйста, обучить меня:

1) Почему это утечка

... и ...

2) Как это исправить

Я знаком с зачатками управления памятью target-C («Если вы выделяете, копируете или новый ... релиз зависит от вас»), поэтому мне не нужен целый учебник по основам - просто некоторое понимание того, почему это протекает.

Заранее спасибо за любую помощь.

РЕДАКТИРОВАТЬ: Прикрепление изображения отладочной информации. Debug Info

Ответы [ 2 ]

3 голосов
/ 07 апреля 2011

Инструментарий говорит вам не о том, что утечка произошла в этой линии, а о том, что объект, созданный в этой строке, протек.

Я бы еще раз посмотрел на код клиента, который использует метод scanJSONStringConstant, и рассмотрел бы его управление памятью. Есть ли логический поток, в котором он может пропустить вызов освобождения для указателя outStringConstant?

1 голос
/ 18 апреля 2012

изменить эту строку *outStringConstant = [[theString copy] autorelease];

К

if(*outStringConstant)
   [*outStringConstant release];

*outStringConstant = [NSString stringWithString:theString];
[theString release];
...