сохранить цикл с основными данными - PullRequest
0 голосов
/ 26 июня 2010

Я думаю, что у меня есть проблема, возможно, связанная с циклом сохранения в Core-Data.Код является следующим, где self.image также является NSManagedObject:

- (void)setImage:(UIImage*)image1 andThumbnail:(UIImage*)image2
{
    self.image.data = UIImageJPEGRepresentation(image1, 0.85); // This is autoreleased
    self.thumbnail = UIImageJPEGRepresentation(image2, 0.85); // This is autoreleased
}

По-видимому, «self.image.date =» имеет одно сохранение, которое никогда не освобождается (и я думаю, что это междуЯ. Изображение и Я).Из-за этого сам объект никогда не будет выпущен и, следовательно, утечка.

РЕДАКТИРОВАТЬ: так что в основном у меня та же проблема, что и здесь: https://devforums.apple.com/message/246219#246219 Я использую точно такую ​​же структуру, где я впредыдущий код соответствует Бар в данной ссылке.У меня также есть та же самая структура контроллера представления.Однако refreshObject не помогает.

Я пытался использовать метод refreshObject NSManagedObjectContext для прерывания цикла сохранения (как предложено в документации Apple).Это не влияет на удержание счета.Я, наверное, не правильно использую его, но не могу найти много информации об этом.Если я использую NSManagedObjectContext: reset: я получаю сбой в корневом контроллере представления, когда возвращаюсь к нему.

Спасибо!

1 Ответ

2 голосов
/ 26 июня 2010

Не следует вмешиваться в управление контекстом управляемого объекта в памяти управляемых объектов.

Если self.image выше - это управляемый объект, и вы не написали собственные средства доступа, то у вас нет проблем с управлением памятью из него.Любая попытка управлять памятью контекста вручную почти всегда вызывает больше проблем, чем решает.

Подсчет остатков ничего вам не скажет, кроме как в самых простых и маленьких приложениях командной строки.Как только вы используете такие среды, как Core Data, сохранение за кулисами становится настолько сложным, что счетчик хранения часто не имеет отношения к тому, что происходит в вашем собственном коде.

По-видимому, у «self.image.date =» есть одно удержание, которое никогда не освобождается (и я думаю, что оно находится между self.image и self).Из-за этого сам объект никогда не будет выпущен и, следовательно, утечка.

Это не произойдет.Вам не нужно уничтожать все объекты в сохраненных атрибутах экземпляра перед тем, как уничтожить сам экземпляр.Если это так, вы не можете уничтожить экземпляр, который совместно использует объект атрибута с третьим объектом.Если это были экземпляры неуправляемого объекта, объект self.image может существовать еще долго после смерти объекта self.Только применение графа сущностей контекстом заставляет их вести себя иначе, и это не имеет ничего общего с управлением памятью.

Если вы видите загадочный счет сохранения 1 на управляемом объекте, то есть сохранение, помещенное в объект контекстом управляемого объекта.Пока контекст полагает, что управляемый объект должен существовать в графе сущностей, он никогда не освободит объект.

Если утечка вообще присутствует в стеке основных данных, ваша проблема, скорее всего, связана с графом сущностей между сущностью self и сущностью self.image.Граф сущностей препятствует тому, чтобы один или другой объект был удален, скорее всего, путем отказа или обязательного отношения.

...