2009-08-28 5 views
1

Я выпускаю вещи, но память, кажется, все еще существует в соответствии с инструментами. Я просто освобождаю указатель, а не фактические данные? Как снять DATA в объективе-c? В чем разница между [anObject release] или [&anObject release]?Как освободить ACTUAL память, а не только указатель на память?

Прошу прощения за недостаток знаний по теме памяти и указателей.

+0

Я не думаю, что "[& anObject release];" даже верно. Цель-C. Предполагая, что «anObject» имеет тип «NSObject *» или «id», это означает, что «& anObject» будет указателем на указатель на объект. – rpetrich

ответ

6
[anObject release]; 

В частности, вы сообщаете объект для уменьшения его сохранить количество на 1. Если это произойдет, упадет до нуля - что он не может по целому ряду причин - то во время выполнения Objective-C будет ссылаться метод -dealloc, который затем вызовет -release на все переменные экземпляра типа объекта (и free() на память malloc'd, если таковые имеются).

Здесь нет никакой магии. release - это всего лишь вызов метода, как любой другой вызов метода. Учитывая вопрос, я хотел бы предложить вам прочитать:

http://developer.apple.com/IPhone/library/documentation/Cocoa/Conceptual/ObjectiveC/Introduction/introObjectiveC.html

И, как только вы развеяли мистику вызова методов, читать это, чтобы полностью понять управление памятью на iPhone:

http://developer.apple.com/iphone/library/documentation/Cocoa/Conceptual/MemoryMgmt/MemoryMgmt.html

+0

Да, я прочитаю документацию. Спасибо – RexOnRoids

+0

Круто - сделай так. Концептуальные руководства действительно являются прекрасным местом для начала. – bbum

1
[anObject release]; 

Сообщает объект для уменьшения его retain счетчик на 1. Каждый раз, когда вы alloc или copy объект, вы возвращаемый объект с сохранить счет одного. Затем, если вы снова нажмете retain, счетчик увеличивается. Или, если вы используете свойство сохранения, снова оно растет.

Вызов освобождения, как я уже сказал, уменьшает этот счет. Когда счетчик достигнет нуля, объект будет отправлен dealloc, который (через вызовы [super dealloc]) в конечном итоге освободит всю память, используемую для этого объекта.

Там также autorelease, но я оставлю это для вас, чтобы открыть для себя. Вы должны прочитать Memory Management docs. Изучите их хорошо.

1

Как правило, распределители памяти не возвращают память операционной системе сразу после выпуска (или даже когда-либо). Таким образом, если инструмент, на который вы смотрите, использует статистику на уровне ОС, он не увидит, что использование спустится даже после того, как вы выпустили некоторый динамически выделенный объект.

+0

Ох. Я этого не знал. Я использую Инструмент «Утечки» iPhone SDK, и обычно я могу сразу увидеть графики распределения объектов (живые объекты), но в этом случае его разные ... Что делает вызов [& anObject release] BTW? – RexOnRoids

+0

Не знаю. Я никогда не писал строки Objective-C в своей жизни. – Novelocrat

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