2009-06-20 2 views
0

У меня есть два класса, класс, который управляет связью db и классом сущности. Класс db имеет метод экземпляра, называемый GetEntityByID: (int) entity_id. Этот метод выполняет простой оператор select и создает экземпляр класса Entity с использованием метода init.Как справиться с управлением памятью в этой ситуации?

Это нормально работает, однако тот, кто называет GetEntityByID, должен запомнить его. Поскольку GetEntityByID не является методом «init», это не кажется правильным. Как лучше всего справляться с управлением памятью в этой ситуации?

+0

Хороший вопрос, и ответы ниже - это здорово. Просто примечание стиля: имена методов обычно начинаются с строчной буквы, поэтому getEntityByID: предпочтительнее. Он работает, но вы его называете, но соглашения о кодировании могут помочь сделать код более удобным. :-) –

ответ

5

Вы можете позвонить по телефону autorelease в свой методпо классу, чтобы автоповторить экземпляр, если он не оставлен в другом месте.

Поскольку экземпляр класса выполняется в рамках метода класса подключения к базе данных DB, объект, который возвращается экземпляру, не «владеет» им - ваш класс подключения к базе данных. На это, по мнению convention, вам нужно памяти управления экземпляра:

Вы берете право собственности на объект, если вы создаете его, используя метод, имя которого начинается с «Alloc» или «новый» или содержит «копию "(Например, alloc, newObject или mutableCopy), или если вы отправите ему сообщение сохранения. Вы несете ответственность за отказ от владения собственными вами объектами с помощью выпуска или авторекламы. В любое другое время, когда вы получаете объект, вы не должны его отпускать.

Если объект отправка метод GetEntityID хочет сохранить объект вокруг, например, если оно должно быть использовано в качестве переменной экземпляра, то возвращается объект может быть сохранен, предотвращая его высвобождены в конце текущее событие. Если он используется только локально и не нуждается в обслуживании после текущего события, тогда класс не должен ничего делать; он будет выпущен пулом autorelease в конце текущего события.

This article объясняет больше об авторешетках.

0

Чтобы autorelease объект вернулся в GetEntityID сделать что-то подобное в GetEntityID:

... // cool stuff in GetEntityID 
return [[entity_id retain] autorelease]; 
} 

Посмотрите на этом действительно nice article объясняющей Mangement памяти Objective-C более подробно.

+0

Я не вижу причин для того, чтобы сохранить их там, но автореферат - правильный ответ. – Chuck

+0

Да, это сохранение] autorelease] не помогает. Пара сохранения и автореферата используется, когда вы ожидаете, что исходное значение будет выпущено в ближайшем будущем, и вы хотите сохранить значение переменной до тех пор, пока пул автозапуска не начнет сбрасываться. –

+0

Я просто хотел быть в безопасности, так как не знал, что было сделано для возвращаемого значения в методе. – diederikh

Смежные вопросы