Релиз не освобождает память в условиях нехватки памяти

Я пытаюсь следовать рекомендации Apple по обработке предупреждений о нехватке памяти (см. Сессию 416 видеороликов WWDC 2009), освобождая ресурсы, используемые при освобождении моего объекта dataController (на который есть ссылки в моем делегате приложения), который содержит большое количество строк для прочитайте из списка:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application {
   [_dataController release];
   _dataController = nil;
   NSLog([NSString stringWithFormat:@"applicationDidReceiveMemoryWarning bottom...      retain count:%i", [_dataController retainCount]]);
}      

Но когда я запускаю ObjectAlloc внутри Instruments и имитирую условие нехватки памяти, я не вижу уменьшения памяти, используемой моим приложением, даже если я вижу выписанные операторы NSLog и счетчик сохранения равен нулю для объекта. Я передаю ссылки на делегат приложения некоторым контроллерам представления. Но приведенный выше код освобождает ссылку на объект _dataController (содержащий данные plist), поэтому я ожидаю освобождения памяти.

Любая помощь будет оценена.

2 ответа

Вы уверены, что делегат приложения является единственным владельцем _dataController? -release только уменьшает количество ссылок, оно не освобождает объект, если количество ссылок не падает до нуля.

Если _dataController принадлежит и другим объектам, отправьте им сообщение, чтобы освободить его.

Я дважды проверяю это. Спасибо за вклад! Я перечитал документы по управлению памятью от Apple и поместил оператор NSLog в метод dealloc моего DataController, и он вызывается. Я также выписал записанный счет перед выпуском и установил в ноль _dataController. Счет удержания равен 1.

Так что это возвращает меня к тому, почему я не вижу значительного снижения использования памяти. Я думаю, что мне нужно лучше понять отображение ObjectAlloc в Instruments и где в моем приложении происходит наибольшее выделение памяти. После поиска помощи в этой области, я разочарован попыткой определить из Инструментов, где это происходит. Я вижу, что есть "3,54 МБ для всех распределений" и 608 МБ для Malloc 32,00 КБ. Если я детализирую Malloc, я вижу только Responsible Caller как вызовы фреймворка, такие как png_malloc и inflateEnd. Я ищу звонки в моем коде, который отвечает за Malloc, но я этого не вижу. Все это говорит о том, что я задаюсь вопросом, освобождаю ли я объект или объекты, которые действительно существенно изменят объем памяти, используемой в условиях нехватки памяти. Я думаю, что мне нужен подробный учебник по инструментам. Справочные документы Apple в порядке, но пример с кодом был бы более полезным.

Другие вопросы по тегам