Сохранить счет Вопрос: Некоторые рекомендации, пожалуйста - PullRequest
0 голосов
/ 25 мая 2010

[Я уверен, что это совсем не странно, но мне нужна небольшая помощь]

У меня есть два retain свойства

@property (nonatomic, retain) NSArray *listContent;
@property (nonatomic, retain) NSArray *filteredListContent;

и в методе viewDidLoad я установил второе значение равным первому (так что теперь retainCount равно двум, я думаю):

self.filteredListContent = self.listContent;

и затем при каждом поиске я делаю это

 self.filteredListContent  = [listContent filteredArrayUsingPredicate:predicate];

Я подумал, что должен сделать release прямо над этим назначением - поскольку свойство должно вызывать дополнительное сохранение, верно? - но это заставляет программу взорваться во второй раз, когда я запускаю метод поиска . Количество сохраняемых данных (без дополнительных release) равняется 2 при первом входе в метод поиска и 1 при каждом последующем (что, к сожалению, я и ожидал).

Некоторое руководство поможет, спасибо! Правильно ли не выпускать?

Ответы [ 3 ]

3 голосов
/ 26 мая 2010

Вы не должны выпускать это, это правильно.

Поскольку переменная хранится в двух местах, ее счетчик хранения должен быть равен 2. Вот причина, по которой она падает. (Сохранить количество self.listContent в скобках.)

self.listContent = someArray                [1]
self.filteredListContent = self.listContent [2]
[self.filteredListContent release]          [1]

self.filteredListContent = somethingElse    [0] -> deallocation of listContent
[self.listContent doSomething]              [whoops, bad things happen]

self.listContent освобождается слишком рано. Если вы не используете [... release], то математика сохранения счета работает.

Прочтите Блог Винсента Гейбла , чтобы получить действительно краткое изложение того, когда использовать выпуск (Интересно, что этот пост был вдохновлен ответом Andiih на Stackoverflow .)

2 голосов
/ 26 мая 2010

Если вы не NARC * объект, вам не нужно release его.

* NARC - Новый, Распределить, Сохранить, Копировать

Сохраняемое свойство как retain s устанавливает новое значение при присвоении, так и release s возвращает старое значение, когда это происходит.

2 голосов
/ 26 мая 2010

Нет, вам не нужно совершать вызов retain до запуска поиска по фильтру. Любое старое значение в свойстве будет освобождено.

При первой проверке счетчика хранения self.filteredListContent и self.listContent ссылаются на один и тот же объект массива, и у обоих есть счетчик ссылок для этого массива. После того, как количество сохраненных результатов поиска self.listContent упало до 1, потому что оно было освобождено self.filteredListContent, когда были установлены (и впоследствии сохранены) результаты поиска.

...