2012-02-10 3 views
1

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

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

+0

Возможный дубликат [Требуется ли устанавливать выходные данные для nil в dealloc (даже после IOS 3.0)?] (Http://stackoverflow.com/questions/5658535/is-it-required-to-set-outlets -varibles к нулю-в-dealloc-даже-после-КСН-3-0) –

ответ

0

Ваш вопрос, кажется, «Как мне обрабатывать свойство retain в dealloc?» Ну, давайте посмотрим на пример.

@property (retain, nonatomic) IBOutlet UIView *myView; 

Когда вид загружен myView удерживается два объектами, иерархия вида (внутренний addSubview: или аналогичным) и контроллер просмотра (с помощью метода инкубационной собственности). Простой журнал - это все, что необходимо для подтверждения этого. размещения этого кода в viewDidLoad подтвердит это с выходом 2.

NSLog(@"myLabel is retained: %i", myView.retainCount); 

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

Первый в viewDidUnload (который обычно вызывается только в ситуациях с низкой памятью) вы хотите освободить представление, и так как это приведет к оборванному указателю, вы также захотите установить указатель на нуль. Xcode достигает этого, просто используя метод setter.

[self setMyView:nil]; 

Второе место, и место, где вы спросили о изначально dealloc. В dealloc вам также нужно освободить вашу собственность, хотя в этом случае (только для основного потока, основанного на IBOutlet в вопросе), оборванный указатель не должен быть проблемой. Это похоже на автоматическую реализацию Xcode dealloc.

[myView release]; 

Конечно установки указателя на nil в дополнение к выпуску не будет иметь пагубные последствия на всех. И даже может быть предпочтительнее, если бы это был не основной поток только UIKit элемент. Но если вы беспокоились о многопоточности, вы, скорее всего, просто используете atomic.

1

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

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