Почему они инициализируют указатели таким образом? - PullRequest
3 голосов
/ 04 мая 2010

Почти во всех книгах, которые я читаю, и в примерах, которые я читаю, указатели инициализируются таким образом. Скажем, у меня есть переменная класса NSString * myString , которую я хочу инициализировать. Я почти всегда буду видеть, как это делается:

-(id)init {
    if (self = [super init]) {
        NSString *tempString = [[NSString alloc] init];
        self.myString = tempString;
        [tempString release];
    }
    return self;
}

Почему я не могу просто сделать следующее?

-(id)init {
    if (self = [super init]) {
        self.myString = [[NSString alloc] init];
    }
    return self;
}

Я не понимаю, почему дополнительная tempString вообще когда-либо нужна, но я мог что-то упустить здесь с управлением памятью. Является ли способ, которым я хочу делать вещи приемлемым, или это вызовет какую-то утечку? Я прочитал Руководство по управлению памятью на developer.apple.com, и, если я что-то упустил, я не вижу разницы.

Ответы [ 2 ]

5 голосов
/ 04 мая 2010

Если self.myString является сохраненным свойством, второй пример должен быть

-(id)init { 
    if (self = [super init]) { 
        self.myString = [[[NSString alloc] init] autorelease]; 
    } 
    return self; 
} 

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

4 голосов
/ 04 мая 2010

Второй пример верен.

Предполагая, что myString является иваром, первый пример на самом деле неверен, поскольку он оставляет myString с висящим указателем (указателем на освобожденный объект). Если бы это было self.myString, это была бы другая история.

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