iphone - вопрос о перевыпуске - PullRequest
       3

iphone - вопрос о перевыпуске

0 голосов
/ 28 октября 2010

В любом классе шаблона iphone UIViewController вы увидите это:

- (void)viewDidUnload {

    // Release any retained subviews of the main view.
    // e.g. self.myOutlet = nil;
}

Но если я установлю self.myOutlet = nil в viewDidUnload, и у меня также будет [self.myOutlet release] в методе dealloc,не слишком ли переиздание self.myOutlet, так как установка его в nil уже установит его счетчик хранения равным нулю?

Если я не освобождаю его в dealloc (), Leaks сообщает об утечке памяти, потому что этоникогда не видит выпуска self.myOutlet, при условии, что у меня есть что-то вроде этого в заголовочном файле:

@property (nonatomic, retain) UIView *myOutlet;

Ответы [ 3 ]

2 голосов
/ 28 октября 2010

Если вы установите self.myOutlet на nil в viewDidUnload, вызов с dealloc на [myOutlet release] просто отправит сообщение об освобождении на nil.Вполне приемлемо отправлять сообщения на nil.Ничего плохого не случится, и вы ничего не перепроизводите.

Осторожно, выпуская объект, на который ссылается myOutlet в viewDidUnload без настройки myOutletдо nil.В этом случае вы получите крах в dealloc.Зачем?Поскольку myOutlet по-прежнему будет ссылаться на область памяти, когда-то занятую объектом myOutlet, а ваш метод dealloc попытается отправить все, что в данный момент находится в этой области памяти, сообщение release.

1 голос
/ 28 октября 2010

Это не переменная, которая имеет счет сохранения; это объект. Когда вы делаете self.something = nil, он действительно освобождает объект - и устанавливает переменную, указывающую на nil. Таким образом, любые дальнейшие release сообщения, отправленные на self.something, не отправляются на исходный объект. Вместо этого они переходят на новое значение, nil, которое радостно игнорирует все, что вы ему говорите.

1 голос
/ 28 октября 2010

-(void)viewDidUnload вызывается при выдаче предупреждения о памяти, -(void)dealloc вызывается при полном уничтожении представления (это не одно и то же).Следовательно, вы должны выполнять оба действия:

- (void)viewDidUnload {

    // Release any retained subviews of the main view.
    self.myOutlet = nil;
} 
- (void)dealloc {
    [self.myOutlet release];
}

Редактировать: то, что сказал Джеймс, продвигает точку.

Ура!

...