Запутался с управлением памятью object-c - PullRequest
0 голосов
/ 22 марта 2012

Ниже приведен фрагмент кода из книги.Почему serialNumber все еще можно установить на новое значение после [serialNumber release];?

 - (void)setSerialNumber:(NSString *)newSerialNumber
{
NSString *newValue;
// Is it a mutable string?
if ([newSerialNumber isKindOfClass:[NSMutableString class]])
// I need to copy it
newValue = [newSerialNumber copy];
else
// It is sufficient to retain it
newValue = [newSerialNumber retain];
[serialNumber release];
serialNumber = newValue;
}

Ответы [ 2 ]

2 голосов
/ 22 марта 2012

newValue и serialNumber являются просто указателями на объекты Objective-C. Когда вы отправляете сообщения типа release или retain, они отправляются фактическим объектам, на которые указывают указатели.

[serialNumber release] отправляет метод release объекту, на который указывает serialNumber. Затем serialNumber = newValue присваивает то же значение, что и указатель newValue, serialNumber. В этот момент значение указателя newValue является изменяемой строкой (либо значением, равным newSerialNumber, либо его копией), которое было сохранено, так как оно было либо скопировано, либо сохранено, так что все выглядит красиво.

0 голосов
/ 22 марта 2012

Сообщение о выпуске уменьшает значение retainCount на 1. Это похоже на вызов любой другой функции.
Когда вы присваиваете переменной-указателю новое значение, вы перемещаете указатель (а не объект, который вы только что использовали в предыдущем выражении) на другой объект.

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