Ваш вопрос, кажется, "Как мне обработать свойство retain
в dealloc?" Хорошо, давайте посмотрим на пример.
@property (retain, nonatomic) IBOutlet UIView *myView;
Когда ваше представление загружено, myView
сохраняется двумя объектами: вашей иерархией представления (внутренним addSubview:
или аналогичным) и вашим контроллером представления (посредством метода установки свойств). Простой журнал - это все, что нужно для подтверждения этого. размещение этого кода в viewDidLoad
подтвердит это с выводом 2.
NSLog(@"myLabel is retained: %i", myView.retainCount);
Есть два метода, где вы должны обращаться к этому указателю, и оба автоматически заполняются для вас Xcode
.
Сначала в viewDidUnload
(который обычно вызывается только в ситуациях с нехваткой памяти) вы хотите освободить представление, и, так как это приведет к висячему указателю, вы также захотите установить указатель на ноль. XCode достигает этого, просто используя метод установки.
[self setMyView:nil];
Второе место, и место, о котором вы спрашивали изначально, - dealloc
. В dealloc вам также необходимо освободить ваше свойство, хотя в этом случае (только выполнение основного потока, основанное на IBOutlet
в вопросе), висячий указатель не должен быть проблемой. Похоже, это подкреплено автоматической реализацией Xcode dealloc.
[myView release];
Конечно, установка указателя на nil
в дополнение к освобождению не будет иметь никакого вреда. И даже может быть предпочтительнее, если бы это был не основной элемент, а только элемент UIKit
. Но если вы беспокоитесь о многопоточности, вы, скорее всего, просто используете atomic
.