проблема утечки памяти с помощью NSData в iPhone

Сборка "мусора" и Располагает (). Хотя Вы ничего не должны делать к свободному память , все еще необходимо освободить , ресурсы через Располагают (). Это - очень легкая вещь забыть, когда Вы используете WinForms или отслеживаете объекты всегда.

5
задан Community 23 May 2017 в 11:48
поделиться

4 ответа

У меня тоже были проблемы с этим в моем большом проекте. Поработав с инженером Apple над поиском утечек, он наконец обратился к основной команде разработчиков Apple, стоящей за NSURLConnection. По сути, они сказали, что в NSURLConnection есть внутренний кеш, который невозможно очистить, и это известная проблема.

Итак, я начал искать альтернативы. Я нашел ASIHTTPConnection (ссылка ниже), который работает вне CFNetwork. Он разработан, чтобы заменить NSURLConnection, плюс кучу других замечательных вещей, таких как загрузка на диск вместо памяти, возобновление загрузки, обратные вызовы индикатора выполнения и т. Д.

Я использовал его во всех своих проектах и ​​у меня есть никогда не было проблем или жалоб. Отвечая на ваш вопрос, вот как я избавился от утечек памяти.

http: // allseeing-i. com / ASIHTTPRequest /

7
ответ дан 18 December 2019 в 05:55
поделиться

У вас есть три строки, давайте разберем их

1. NSData *imageData = [[NSData alloc] init];
2. imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]];
3. [imageData release];

Строка 1: выделить и инициализировать новые NSData. Этот NSData будет иметь счетчик ссылок +1

Строка 2: получить данные из Интернета и поместить в NSData. Это устанавливает для используемой переменной Line 1 новое значение NSData (которое настроено на автозапуск), скрывая выделенные и инициированные NSData в строке 1

Строка 3: освобождает NSData, полученные в строке 2.

Вы можете удалить строку 1 и 3 и просто добавьте объявление переменной в Строку 2. Поскольку он автоматически выпускается, он будет выпущен позже циклом событий ...

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]];

Я предлагаю вам прочитать разделы Управление памятью здесь

]
10
ответ дан 18 December 2019 в 05:55
поделиться

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

Во-вторых. Вам не нужно первое сообщение цепочки alloc init . Все, что вам нужно, это:

NSData *imageData = [NSData dataWithContentsOfURL:[NSURL URLWithString:@"www.xyz.abc.com"]];

Конечно, я не знаю, правильный ли этот вызов, но я знаю, что он возвращает автоматически выпущенный объект NSData, что означает, что ваш предыдущий alloc init будет протекать.

4
ответ дан 18 December 2019 в 05:55
поделиться

Всякий раз, когда мы используем dataWithContentOfURL , мы должны заключать его в NSAutoReleasePool , как показано ниже:

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

// ** Your Operations **

NSData *data = [NSData dataWithContentsOfURL:someURL];

// ** Your Operation **

[data autorelease];
[pool release];

Это применимо даже для NSURLRequest и NSURLConnection .

Проблема связана с самим компилятором, и описанный выше единственный метод решения проблемы.

7
ответ дан 18 December 2019 в 05:55
поделиться
Другие вопросы по тегам:

Похожие вопросы: