2010-04-22 1 views
0

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

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

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

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

ответ

1

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

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

0

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

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