2010-01-07 2 views
0

Ладно, пожалуйста, медведь с моим описанием моей ситуации:Высвобождение управляемых объектов в Objective-C

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

В моем приложении у меня есть GridView, который содержит серию под-представлений (типа CellView). GridView обладает свойством представленнымGrid, и CellView имеет свойство представленное Cell (как неатомное, так и сохраняемое). В методе setRepresentedGrid GridView я задал свойство представленное свойство CellView (subviews GridView) для одной из ячеек в представленномGrid.

сейчас, у меня есть два вопроса:

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

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

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

+1

Почему вы пишете пользовательские геттеры и сеттеры? –

+0

См. Комментарии ниже. Я хочу, чтобы представление позаботилось о некоторых функциях настройки, когда установлен его представленный массив. Я считаю, что это стандартная причина для желания настроить установщик для свойства. – FTLPhysicsGuy

ответ

0

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

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

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

+0

Я пишу свой собственный сеттер, чтобы, указав GridView на его сетку, он автоматически настраивает свои под-представления CellView для представления ячеек в сетке. Он также добавляет себя в качестве наблюдателя к уведомлениям из сетки (поэтому вид может меняться при изменении сетки). В общих концепциях программирования одна из причин свойств (а не прямого доступа к полям) заключается в предоставлении настраиваемых геттеров/сеттеров, которые могут выполнять необходимые функции при доступе к связанному свойству. Конечно, я синтезирую подавляющее большинство моих свойств. – FTLPhysicsGuy

1

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

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

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

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

+0

Ваш комментарий об обновленииОбъект обновил мою память - теперь я вспоминаю про чтение об этом, когда впервые посмотрел на Core Data. Благодаря! – FTLPhysicsGuy

1

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

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