Управление памятью Objective-C: когда я [выпускаю]? - PullRequest
0 голосов
/ 10 июня 2010

Я все еще новичок в этом деле управления памятью (Сборщик мусора позаботился обо всем на Java) , но, насколько я понимаю, , если вы выделяете память для объекта, то вы должны освободить эту память обратно на компьютер, как только закончите работу с вашим объектом.

myObject = [Object alloc];

и

[myObject release];

Прямо сейчас у меня есть только 3 части в моем файле Objective-C .m : @ Interface , @ Реализация и main, Я выпустил свой объект в конце программы рядом с этими парнями:

[pool drain];
return 0;

Но что, если бы эта программа была намного сложнее, было бы хорошо выпустить myObject в конце программы?

Наверное, лучше задать вопрос, когда я освобождаю выделенную память объекта? Как я знаю, где разместить [myObject release];?

Ответы [ 3 ]

3 голосов
/ 10 июня 2010

Это, вероятно, немного упрощено, но в целом вы захотите выпустить его там, где вы его объявили.

Если вы объявляете объект ВНУТРИ конкретного вызова метода, то по определению вы закончите с этим объектом (или, по крайней мере, с этим дескриптором этого объекта) в конце вызова этого метода ... отпустите его.

Если вы объявляете объект как переменную экземпляра, то по определению вы закончите с ним, когда этот экземпляр уничтожен ... освободите его в методе dealloc этого класса.

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

У Apple есть фантастическая документация по управлению памятью, я мог бы проверить ее на developer.apple.com .

1 голос
/ 10 июня 2010

Вы должны думать с точки зрения собственности.Когда вы вступаете во владение объектом, вызывая alloc , new или retain , вы также отвечаете за его освобождение, либо вызывая autorelease когда вы возвращаете принадлежащий объект вызывающей стороне или вызываете release .

Общее правило:

Localпеременная : освободить ее в том же методе.Если вы хотите вернуть его вызывающей стороне, используйте autorelease

Участник класса : отпустите его в методе dealloc

1 голос
/ 10 июня 2010

В сущности, у вас есть три вида объектов, каждый с разным шаблоном.

Переходные объекты

В общем, вы должны autorelease временные объекты.Это объекты, которые размещены локально и не должны существовать за пределами метода, в котором они вызываются.Или они передаются от метода к методу.

Цепочка владения

Когда один объект существует как поле экземпляра внутри другого, вы должны release "принадлежащий""(или" дочерний ") объект, когда объект" владелец "(или" родитель ") исчезает.Это делается в методе dealloc родительского объекта:

- (void) dealloc {
    [child release]; // child was declared as an instance variable
    [super dealloc];
}

Время жизни программы

Когда объект предназначен для существования в течение времени жизнипрограмме обычно вообще не нужно вызывать release, если только не требуется какая-то очистка ресурса.Вы можете поместить это в applicationWillTerminate:, который вы можете найти в документации Apple.

(Возможно, вам следует избегать таких объектов, но это обсуждение другого вопроса.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...