2010-06-10 3 views
0

Я еще новичок в этом Управление памятью вещи (Garbage Collector заботилась обо всем в Java), но, насколько я понимаю , если выделить память для объекта, то вы должны освободить эту память обратно к компьютер, как только вы закончите свой объект.Objective-C Управление памятью: Когда я [выпускаю]?

myObject = [Object alloc]; 

и

[myObject release]; 

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

[pool drain]; 
return 0; 

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

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

ответ

3

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

Если вы объявите объект INSIDE определенным вызовом метода, то по определению вы будете завершены с этим объектом (или, по крайней мере, с этим дескриптором этого объекта) в конце этого вызова метода ... затем отпустите его.

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

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

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

1

У вас по существу есть три вида объектов, каждый из которых имеет другой узор.

Перепады объектов

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

Цепь собственности

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

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

Lifetime Программы

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

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

+2

Пожалуйста, следует отметить, что 'applicationWillTerminate:' не называется в прошивке 4 большинства время. – ohho

+0

Хороший звонок. В любом случае, это не метод. –

1

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

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

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

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

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