Как мне управлять управлением памятью в этой ситуации? - PullRequest
0 голосов
/ 20 июня 2009

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

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

Ответы [ 2 ]

5 голосов
/ 20 июня 2009

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

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

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

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

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

0 голосов
/ 20 июня 2009

Для автоматического освобождения объекта, возвращенного в GetEntityID, сделайте что-то подобное в GetEntityID:

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

Взгляните на эту действительно хорошую статью , более подробно объясняющую управление памятью в Objective-C.

...