Выпуск объекта iOS слишком рано - возможна путаница с Autorelease и Copy - PullRequest
0 голосов
/ 01 сентября 2011

Я написал приложение с пользовательским классом поиска.Это создает массив результатов.

Затем я назначаю этот массив в мой класс FirstViewController и перезагружаю табличное представление, которому назначен массив результатов

self.aResults = [thisSearch.aResults copy]
...
[[self searchResults] reloadData];

Вскоре после этогоЯ выпускаю thisSearch

[thisSearch release];

Это все работает нормально и показывает таблицу результатов, но если я прокручиваю таблицу вниз и смотрю на строки ниже, они все пустые,затем, когда я прокручиваю назад, приложение аварийно завершает работу, когда оно перезагружает ячейки переработанной таблицы.

Этого раньше у меня не было, но я понял, что у меня происходит утечка памяти, поэтому я пошел autorelease сумасшедший, и добавил много autorelease в мой Поиск класс.Но не мой FirstViewController класс.

Так что, если я использую Copy , не делает ли он на самом деле копию объекта, просто увеличивает счетчик ссылок?Поэтому, когда я уничтожаю Поиск , я уничтожаю там массив результатов и, следовательно, уничтожаю то, что FirstViewController пытается получить для представления таблицы?

Извините, если это не так многоощущение, что я не чувствую себя с этим сегодня.

1 Ответ

1 голос
/ 01 сентября 2011

Когда вы copy объекты (и для этого этот объект должен соответствовать протоколу NSCopying, но в случае NSArray) это точно так же, как если бы вы init впервые обрабатывали его с помощью предопределенные значения.

То есть ваша ответственность перед release объектами, которые были copied.

То, что вы должны сделать:

self.aResults = [thisSearch.aResults copy]
...

[thisSearch release]; // When you release thisSearch this will not affect aResults
...

// then you can either do:
[self.aResults autorelease]; // but then do not release it later on
// or
[self.aResults release]; // when you're done with it

Однако я сомневаюсь, что это решит проблемы с памятью. Из-за чрезмерного автоматического высвобождения (и, тем не менее, выпусков) вы могли полностью испортить управление памятью вашего приложения.

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

enter image description here

Также я прилагаю ссылку Apple Memory Management , которую нужно читать ежемесячно, пока она не станет второй натурой.

...