Освобождение управляемых объектов в Objective-C - PullRequest
0 голосов
/ 07 января 2010

Хорошо, ПОЖАЛУЙСТА, потерпите мое описание моей ситуации:

У меня есть модель Core Data, которая (в упрощенном описании) включает объект GridManager. GridManager содержит набор объектов Grid (через отношение ко многим). Объект Grid содержит набор объектов Cell (через отношение ко-многим).

В моем приложении у меня есть GridView, который содержит серию вложенных представлений (типа CellView). У GridView есть свойство presentGrid, а у CellView есть свойство presentCell (как неатомичное, так и сохраняемое). В методе setRepresentedGrid GridView я установил для свойства представленного Cell для каждого CellView (подпредставления GridView) одну из ячеек вovangrid.

СЕЙЧАС, у меня есть два вопроса:

Во-первых, поскольку ячейки и сетка являются управляемыми объектами, нужно ли по-прежнему освобождать свойства presentGrid и presentCell классов GridView и CellView, когда они работают? Я думаю, что я делаю (так же, как с любым сохраненным свойством), но в какой-то момент я подумал, что это вызывает проблему с моим приложением - хммм ... просто подумал, так как я пишу свои собственные сеттеры, и я на самом деле не сохраняю сетка / ячейка, возможно, мне не нужно освобождать их?

Во-вторых, одновременно активна только одна сетка из gridManager. Когда я переключаю gridView.representedGrid из одной сетки в другую, как мне «освободить» первую сетку (и связанные с ней ячейки), чтобы она не занимала ненужную память (учитывая, что мы говорим об управляемых объектах).

Большое спасибо!

Ответы [ 3 ]

1 голос
/ 07 января 2010

Насколько я понимаю, вы должны избегать пользовательских геттеров и сеттеров, а затем можете оставить основные данные, чтобы делать свое дело, и не беспокоиться о сохранении / выпуске.

Что касается уменьшения накладных расходов памяти, вы можете запросить данные ядра, чтобы превратить ваш объект в ошибку, используя этот метод: refreshObject:mergeChanges:

Ознакомьтесь с документацией Apple здесь: http://gemma.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/index.html. Все это есть и, надеюсь, я смог дать вам правильные условия для поиска.

Надеюсь, это поможет.

1 голос
/ 07 января 2010

Если ваши сеттеры сохраняют управляемые объекты, вам нужно освободить их, чтобы они соответствовали сохранению / освобождению. Однако вам может не потребоваться сохранять управляемые объекты в зависимости от того, как разработано приложение.

Не видя весь код, трудно дать твердый совет, но вы можете использовать анализатор для проверки на утечки, использовать инструменты, чтобы убедиться, что ваша память не увеличивается из-под контроля и т. Д. И последнее, но не в последнюю очередь вы можете отключите сохранение, переключите их на назначения и посмотрите, не сработает ли это. Так как NSManagedObjectContext сохранит объекты, есть большая вероятность, что вашим представлениям вообще не нужно сохранять экземпляры NSManagedObject.

0 голосов
/ 07 января 2010

Да, вам нужно освободить ваши свойства presentGrid и presentCell в вашем методе dealloc.Если вы этого не сделаете, методы сохранения / освобождения не будут сбалансированы - ваш установщик сохранит объект, и при отсутствии соответствующего освобождения объект никогда не будет освобожден.

При правильной записи сохраняющий установщиквыпустит свое старое значение и сохранит новое значение.Поэтому нет необходимости освобождать старую сетку при настройке gridView.representedGrid.

Почему вы пишете свои собственные сеттеры из любопытства?

...