Утечка NSDictionary на iPhone и объектный граф ссылок - PullRequest
0 голосов
/ 15 марта 2009

Я просто загружаю plist во временный словарь для инициализации моей модели данных. К сожалению, эта единственная строка кода, приведенная ниже, приводит к постоянной утечке в течение жизненного цикла приложения в соответствии с Инструментами. Утечка объектов NSCFString и GeneralBlock на Malloc, а ответственная библиотека - Foundations.

Мои два вопроса для опытных глаз:

  1. Я делаю что-то странное, чтобы вызвать это? Я попытался окружить его в блоке автоматического выпуска, но это не имело никакого эффекта.
  2. Есть ли способ напечатать список ссылок на объекты подозрительного объекта, чтобы получить представление о процессе осиротения объекта.

Линия утечки:

NSDictionary *tempDict = [NSDictionary dictionaryWithContentsOfFile:
                             [[NSBundle mainBundle]
                                 pathForResource:resourceName
                                 ofType:@"plist"]];

totalChapters = [[tempDict objectForKey:@"NumberOfChapters"] intValue]; 
chapterList  = [[NSMutableArray alloc] initWithCapacity: totalChapters];
[chapterList addObjectsFromArray:[tempDict objectForKey:@"Chapters"]];

Ответы [ 3 ]

2 голосов
/ 15 марта 2009

Похоже, вы можете просочиться по этой линии:

[[NSMutableArray alloc] initWithCapacity: totalChapters];

Если этот объект не был освобожден, то любые добавленные к нему объекты также не будут освобождены


Редактировать (потому что это слишком долго для комментария):

Инструменты сообщают вам, где была выделена память, но не почему она все еще сохраняется. Когда NSDictionary загружает содержимое файла, он должен создать объект для каждого элемента, который он загружает. Если позже кто-то найдет объект, используя objectForKey:, retain, и забудет release, будет сообщено об утечке. Оператор dictionaryWithContentsOfFile будет обвинен в этом, потому что он выполнил распределение.

Я согласен с фантомной отладкой Дона. Скорее всего, вы не выпустили старый chapterList при повторном назначении.

0 голосов
/ 29 декабря 2009

Блок автоматического выпуска влияет только на объекты, помещенные в пул автоматического выпуска. Таким образом, tempDict - это место в пуле авто-выпусков, а totalChapters - нет. Если вы хотите использовать пул автоматического выпуска, то вы либо хотите:

[[[NSMutableArray alloc] initWithCapacity: totalChapters] autorelease];

или не используйте пул автоматического выпуска и используйте:

[[NSMutableArray alloc] initWithCapacity: totalChapters]
а затем
[totalChapters release]

Рекомендуется избегать пула автоматического выпуска, если в этом нет необходимости.

0 голосов
/ 15 марта 2009

Я освобождаю все выделенные вещи в методе dealloc этого класса. Строка TROUBLED ниже неоднократно вызывается при каждом выделении init, чтобы помочь мне загрузить новые главы на основе выбора пользователя.

NSDictionary * tempDict = [NSDictionary dictionaryWithContentsOfFile: [[NSBundle mainBundle] pathForResource: resourceName ofType: @ "plist"]];

Поскольку я использую удобный метод в NSDictionary, у меня нет ничего для Dealloc. Но прибор указывает на эту конкретную линию как источник утечки через Malloc.

tempDict - это просто пустое место для словаря для загрузки списка и запуска иваров.

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