iOS: dealloc и IBOutlet - PullRequest
       1

iOS: dealloc и IBOutlet

1 голос
/ 10 февраля 2012

Обязательно ли устанавливать все @property с модификатором retain, объявленным как IBOutlet в nil внутри метода - (void)dealloc? Будет ли память израсходована / потрачена впустую, если я этого не сделаю?

Предположим, что автоматический подсчет ссылок выключен.

Ответы [ 2 ]

1 голос
/ 10 февраля 2012

Даже без ARC нет необходимости nil вашего IBOutlets в -(void)dealloc.Тестирование с использованием инструментов показывает, что память для элементов интерфейса, подключенных к IBOutlets, освобождается очень хорошо, как только UIView освобождается.

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

0 голосов
/ 11 февраля 2012

Ваш вопрос, кажется, "Как мне обработать свойство 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.

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