Использование инструментов для проверки утечки памяти в XCode? - PullRequest
2 голосов
/ 10 апреля 2011

Добрый день,

Я совершенно неопытен в проверке на утечки памяти, и поэтому любая помощь с этим будет отличной.

Я только что закончил основную часть работы для своего приложения для iPhone, и сейчас я пытаюсь выяснить, почему оно перестает работать после нескольких запусков.Используя инструменты в режиме утечки и распределения, я вижу, что есть два объекта, которые накапливают память довольно быстро и не освобождают: enter image description here

Я не уверен на сто процентов, где или почему это происходит, ноКогда я щелкнул стрелку справа от UIDeviceRGBColor, Ответственный вызывающий абонент обозначается как

[UIColor allocWithZone];

. Я выполнил поиск в своем проекте для UIColor и обнаружил следующее (обратите внимание на _colorThreshold):

enter image description here

Я считаю, что моя проблема связана с _colorThreshold, который, похоже, не выпускается:

enter image description here

Я пытался добавитьautorelease к их аргументам инициализации, но это привело к падению приложения.Любой совет здесь?


РЕДАКТИРОВАТЬ 1

Вот снимок экрана от LevelMeter.h enter image description here

1 Ответ

2 голосов
/ 10 апреля 2011

Существует несколько проблем с указанным выше:

  • Является ли LevelMeterColorThreshold классом Objective-C?
  • Если так, почему вы используете malloc вместо обычного alloc / init?
  • Когда вы вставили скриншоты результатов поиска, мы не можем видеть окружающий код, поскольку отображаются только строки с поисковыми хитами.

Прибор Leaks сообщает об утечках или вы просто выделяете ненужную память?
Существует разница между этими двумя случаями:

  1. Утечка происходит, если вы теряете ссылку на объект, так что вы не можете отправить ему сообщение release позже.
  2. Создание объектов, которые больше не нужны, без их освобождения / освобождения

Утечки могут обнаружить только первый случай.
Образец для утечки:

NSMutableString* test = [[NSMutableString alloc] initWithString:@"1"];
NSLog(@"%@", test);
NSMutableString* anotherTest = [[NSMutableString alloc] initWithString:@"2"];
test = anotherTest; //here we loose reference to the original object
NSLog(@"%@", test);

Назначив для проверки еще один тест, мы потеряли ссылку, указывающую на адрес памяти, содержащий @ "1".

...