релиз не освобождает память в условиях нехватки памяти - PullRequest
0 голосов
/ 22 апреля 2010

Я пытаюсь следовать рекомендации 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 ]

1 голос
/ 22 апреля 2010

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

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

0 голосов
/ 23 апреля 2010

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

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

...