#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 (как я всегда делаю с сохраненными свойствами). Так что просто проверьте, что ваши сохранения и релизы всегда совпадают, поскольку кажется, что их выпускают слишком часто.