Автоматизация dealloc / viewDidUnload Objective-C - PullRequest
2 голосов
/ 18 ноября 2011

Эти два фрагмента выполняют одно и то же?Предполагая, что в моем файле интерфейса есть три кнопки IBOutlet UIButton, которые называются buttonOne, buttonTwo и buttonThree:

- (void)dealloc {
    for(UIButton* idx in self.view.subviews)
        [idx release], idx = nil;

    [super dealloc];
}

и

- (void)dealloc {
    [buttonOne release], buttonOne = nil;
    [buttonTwo release], buttonTwo = nil;
    [buttonThree release], buttonThree = nil;
    [super dealloc];
}

Редактировать:

Как иногда кажется ARCполная альтернатива управлению памятью в iOS, я предпочитаю не использовать ее, потому что а) я чувствую, что я обманываю и б) если я не ошибаюсь, это работает только на устройствах iOS 5.

Ответы [ 3 ]

5 голосов
/ 18 ноября 2011

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

Вы должны объявить свои торговые точки weak (при использовании ARC) или assign (если не использовать ARC).Тогда вам не нужно выпускать их в dealloc.A UIView сохраняет свои подпредставления и освобождает их, когда они освобождаются, поэтому вам не нужно сохранять или освобождать их.Вы просто отпускаете self.view (или, если вы подкласс UIViewController, вы позволяете [super dealloc] позаботиться о выпуске self.view).

0 голосов
/ 18 ноября 2011

Да и нет Если у вас есть другие представления в качестве подпредставлений, то они также будут выпущены в первом методе, но не во втором. Иначе, если только кнопки являются подпредставлениями, тогда да, эти две вещи будут иметь одинаковый результат.

Я предлагаю изучить ARC, чтобы вам не приходилось беспокоиться об этом бизнесе по управлению памятью.

0 голосов
/ 18 ноября 2011

Нет, они не делают, первый будет проходить через ВСЕ представления в подпредставлениях представлений, все, что делает foreach, приводит его к UIButton, но вы перебираете весь контент массива подпредставлений представлений ... вы должны сделать

- (void)dealloc {
    for(UIButton* idx in self.view.subviews)
   {
        if([idx isKindOfClass:UIButton])
        { [idx release] } 
    }
    [super dealloc];
}
...