проблема управления памятью iphone - PullRequest
0 голосов
/ 13 марта 2009

Как проверить, был ли объект освобожден из памяти?

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

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

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

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

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

1 Ответ

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

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

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

Правильная последовательность для сохраненного свойства:

  1. alloc init // retain == 1

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

  3. release the object // retain == 1

Что оставляет счетчик единиц, утечка памяти отсутствует.

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