2009-03-13 3 views
0

Как проверить, был ли объект выпущен из памяти?проблема с управлением памятью iphone

Я знаю, что объект должен быть выпущен вручную, когда мы используем alloc | copy | сохранить для создания этого объекта. если использовать метод класса экземпляра (NSString stringwithformat:), объект будет автоматически отпущен на NSAutoRealeasePool, однако иногда есть какой-то объект, который был использован для освобождения функции (void)dealloc.

Может кто-нибудь сказать мне

  1. В чем разница между [object release] сразу после того, как функции Alloc, [object release] на (void)dealloc и NSAutoReleasePool освободить объект?

  2. Когда вызывается функция (void)dealloc, а когда NSAutoReleasePool освобождает память, я знаю, что это каждый цикл цикла, как я могу проверить его из кода?

  3. Когда я объявил переменную в заголовке и установил свойство как сохранение, я все еще могу использовать функцию alloc для этого объекта, но не вызывать утечку памяти, но от this post кажется, что однажды объявлен объект сохранения в заголовке , то вы больше не можете назначить объект, потому что оба сохранят объект, может ли кто-нибудь сказать мне, почему я все еще могу так писать, не вызывая утечки памяти?

+0

retag: "memory" и "management" to "memory-management" – Jeremiah

+0

Это действительно вопрос, на который нельзя ответить очень хорошо в этом формате.Вам нужно получить хорошую книгу по программированию Objective-C и изучить ее. (Или просто отказаться от управления памятью и придерживаться ARC.) –

ответ

4
  1. [object release] релизы ваш объект немедленно. После отправки сообщения о выпуске вы не должны использовать объект снова - если вы не знаете, что у вас все еще есть удержание на этом объекте. Если ваша последняя была сохранена, память может быть освобождена во время разговора. Autorelease освобождает объект «когда-нибудь позже», система не гарантирует ничего о значении «позже», кроме того, что это будет после объема текущего сообщения.

  2. См. Выше, нет реального qay, чтобы гарантировать, когда dealloc вызывается после авторекламы с точки зрения вашего кода. Вы должны просто предположить, что это когда-то после возврата метода, в котором вы отправляете сообщение автореферата.

  3. Вам просто нужно сбалансировать сохранение и выпуск. Если у вас есть один для многих (как, вероятно, в ситуации, которую вы описываете), это утечка. И наоборот, если у вас есть дисбаланс другим способом, вы получите более разрушительную ошибку при доступе к освобожденной памяти.

Правильная последовательность для удерживаемого имущества:

  1. alloc init // retain == 1

  2. set the property // retain == 2 due to setProperty calling retain.

  3. release the object // retain == 1

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

+0

Я бы изменил ваш # 1, чтобы поставить период после «вы не должны использовать объект снова». Вы никогда не должны использовать объект снова после его выпуска. Вы можете «знать», что у вас есть другой, но это делает ваш код сбивающим с толку, когда вы можете так же легко переместить вызов выпуска в другое место. – Alex

+0

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

+0

... или если у вас есть два варианта сохранения и освобождение, но вы знаете, что у вас все еще есть другие. –

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