iOS SDK - реализация dealloc - сначала освободить дочерние представления? - PullRequest
1 голос
/ 05 января 2011

Я заканчиваю приложение для iPad, и для меня это означает заполнение всех методов dealloc в моих классах.

У меня много перьев в моем перо, и большинство из них содержит подпредставления (т.е. UIView s, UILabel s и т. Д.) Должен ли я освободить дочерние представления перед освобождением родителя? Если родительское представление будет освобождено, будут ли также освобождены его дочерние представления?

Пример:

-(void)dealloc
{
    [super dealloc];
    [childView release];  // Do I need this if I use the next line?
    [parentView release];  // Will this perform the line above?
}

И childView, и parentView являются свойствами моего контроллера представления. Оба были сохранены.

Ответы [ 3 ]

9 голосов
/ 05 января 2011

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

Кроме того, вы должны вызывать [super dealloc] вконец вашей dealloc реализации, а не начало (например, потому что вы можете зависеть от ресурсов суперкласса, которые все еще доступны в то время).

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

Между прочим, сохранение написания деллока до тех пор, пока вы не закончите работу над приложением, - это обратный путь. Я знаю, что это похоже на уборку дома, но дело в том, что пока вы не будете правильно управлять памятью, у вас будет очень искаженное представление о том, как на самом деле работает ваше приложение.

В идеале вы должны писать вызовы dealloc, когда пишете свои операторы @synthesize. Другими словами, вы добавляете свойство в свой класс, устанавливаете его как сохраняемое свойство, пишете код @synthesize и -release. Таким образом, вы знаете, что ваше управление памятью в основном чисто (я имею в виду, в любом случае, на уровне свойств класса), и вы можете уверенно писать код.

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

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

Любые представления, которые автоматически выделяютсяиз пера вы можете неявно высвободить, установив на выходе ноль.Например:

- (void)viewDidUnload {
    [super viewDidUnload];
    self.subviewOutletOne = nil;
    self.subviewOutletTwo = nil;
}

Затем для любых объектов, которые вы явно сохраняете, вы освобождаете их в методе dealloc, как вы планируете сделать:

- (void)dealloc {
    [myDataArray release];
    [coolAnimatedImage release];
    [myCustomSubview release];
    [super dealloc];
}

Также обязательно проверьтеинструмент LEAKS .Это случайное руководство по использованию встроенного инструмента анализа утечек.Там могут быть другие / лучшие.Это может быть боль, чтобы начать работать в первый раз, но это того стоит.

...