Iphone: где выпустить объекты? - PullRequest
2 голосов
/ 11 января 2011

где я должен освобождать объекты: в методе dealloc или viewDidUnload?

Спасибо

Ответы [ 4 ]

2 голосов
/ 11 января 2011

Краткий ответ на ваш вопрос: dealloc ()

Длинный и более сложный ответ на ваш вопрос: оба

  1. освобождают любые неиспользуемые IBOutlets в viewDidUnload ().Этот метод вызывается, когда на вашем устройстве заканчивается память.
  2. освобождает все объекты, которые контролирует текущий контроллер представления, за управление памятью, и освобождает их в dealloc ().(Автоматически выпущенный объект не относится к этой категории)
2 голосов
/ 11 января 2011

Правильный способ - освободить их и установить их равными нулю в обоих этих методах.

  1. Вам необходимо освободить ваши объекты в viewDidUnload, так как могут появляться предупреждения памяти, и если у вашего представления нет суперпредставления, вы должны освободить свои выходы, чтобы сэкономить память.Фреймворк снова выдаст viewDidLoad, если представление было выгружено.
  2. Вам необходимо освободить ваши объекты в dealloc, поскольку viewDidLoad + viewDidUnload не обязательно вызывается.

Наконец, вам нужноустановите переменные равными nil в обоих методах, чтобы не вызывать release для них во второй раз.

1 голос
/ 11 января 2011

Любые объекты, выделенные и / или сохраненные как часть loadView и / или viewDidLoad, должны быть освобождены в viewDidUnload.Выпуск всего, что вы выделяете в viewDidLoad, легко понять, loadView немного сложнее, если вы используете NIB.Любое IBOutlet, которое является свойством, определенным как retain, будет неявно сохранено как часть loadView.

Если представление имеет, например, подпредставление, которое является UITextField, и вы подключаете это представление ксвойство, определенное как:

 @property(nonatomic, retain) IBOutlet UITextField* nameField;

Тогда фактическое текстовое поле при загрузке из NIB будет иметь счет сохранения +2.+1 из-за родительского представления и +1 из-за свойства, к которому вы его подключили.Таким образом, его память не освобождается до тех пор, пока не будет освобожден контроллер представления или пока не будет загружена NIB.

К сожалению, viewDidUnload не вызывается, когда контроллер представления освобождается.Таким образом, вы также должны явно выпустить все свои `IBOutlets здесь.Я использую эту скороговорку, чтобы не забыть выпустить что-нибудь:

-(void)releaseOutlets {
  // Set all outlets to nil
}

-(void)viewDidUnload {
    [self releaseOutlets];
    [super viewDidUnload];
}

-(void)dealloc {
    [self releaseOutlets];
    // Release anything else.
    [super dealloc];
}
0 голосов
/ 11 января 2011

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

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