Основные массивы данных через некоторое время пустеют

#iphone #ios #arrays #core-data #memory-management

#iPhone #iOS #массивы #core-data #управление памятью

Вопрос:

Возможно, я чего-то не понимаю в управлении памятью в Core Data. Мне удалось получить массив объектов. Я сохранил этот массив с помощью Retain . После этого я вижу, что этот массив, который я сохранил, пуст. У него есть адрес памяти, но нет объектов (когда я его сохранил, у него были объекты). Может кто-нибудь, пожалуйста, помочь мне разгадать эту тайну?

Avi

Ответ №1:

Есть несколько возможностей.

(1) Вы не сохраняете массив, вы сохраняете изменяемый массив (хотя вы этого не знаете!), А кто-то другой изменяет его содержимое. Вместо retain этого попробуйте copy .

(2) Вы случайно меняете массив, на который указываете. Вы можете выяснить это, установив точку останова в строке, в которой хранится ваш массив, и посмотреть, сколько раз он срабатывает.

Вы обязательно должны выполнить (1), даже если это не исправит вашу ошибку. Все, что имеет изменяемый подкласс (т.Е. NSArray имеет NSMutableArray, NSSet имеет NSMutableSet и т. Д.) copy , Не должно быть retain

Комментарии:

1. Привет, спасибо. Изменил его на NSArray. По-прежнему никакой помощи… Теперь я вижу, что был неправ. Через некоторое время массив равен нулю … не знаю почему. Очень странно…

2. подождите — массив ‘nil’ или массив пуст?

Ответ №2:

Перед сохранением в массив всегда выделяйте этот массив. И если вы создаете массив внутри блока, он может быть недоступен вне блока. в интерфейсе: NSMutableArray * Общий;

в реализации: commonAry=[[NSMutableArray alloc] init];//выделение массива coomon теперь вы можете добавить выбранный объект в массив.

Ответ №3:

У меня была точно такая же проблема. Оказалось, что у меня было сохраненное свойство, которое было ДОСТУПНО ТОЛЬКО для ЧТЕНИЯ, и я устанавливал внутренний элемент и не сохранял его в методе инициализации. Однако я все еще освобождал его с помощью метода dealloc (как я всегда делаю с сохраненными свойствами). Так что просто проверьте, что ваши сохранения и релизы всегда совпадают, поскольку кажется, что их выпускают слишком часто.