2009-07-27 2 views
1

Если мы напишем следующий код:Objective-C Делегат Указатели

ExplorerAppDelegate * appDelegate = (ExplorerAppDelegate *)[[UIApplication sharedApplication] delegate]; 

Это делает ссылку на исходный указатель делегата, но:

  • ли увеличить это подсчитывать ссылка?
  • Должно ли мы явным образом позвонить как [ExplorerAppDelegate retain] сразу или совсем?
  • Что происходит, точно?

После того, как мы использовали это, мы также должны сделать [ExplorerAppDelegate release] в методе dealloc, не так ли?

ответ

0
  1. Счетчик ссылок не будет увеличен
  2. Вы должны сохранить его, если вы хотите, чтобы убедиться, что она не удалена, пока у вас есть указатель на это
  3. Вы должны освободить его только если вы удерживаемые это

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

+0

Благодарим за ответ. :) – user145374

+0

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

2

Нет, это не увеличивает количество удержаний.

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

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

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

+0

Спасибо за ваш ответ .. :) – user145374

0

См. «Слабые ссылки на объекты» в Memory Management Programming Guide for Cocoa для получения официального ответа. Указатели на делегаты являются одним из возможных исключений для правил управления памятью.

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