Почему он не падает? - PullRequest
2 голосов
/ 25 марта 2012

Почему этот фрагмент кода работает:

NSNumber *a = [[NSNumber alloc] initWithInt:5];
[a release];

NSLog(@"%i", [a intValue]);// it shows 5. why???

Сообщение intValue отправляется освобожденному объекту.его счетчик ссылок должен быть 0. Что происходит?

Ответы [ 3 ]

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

Освобождение указателя просто сообщает диспетчеру памяти ОС, что память больше не используется - блок памяти, в котором находился объект, фактически не будет изменен.

Однако, поскольку теперь он "мертв"msgstr "память, вероятно, что при более позднем выделении этот блок памяти будет использоваться повторно.

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

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

Я думаю, что NSNumber имеет специальную реализацию, точно так же, как NSString.

[NSNumber alloc] фактически не выделяет память, а скорее возвращает универсальный указатель.Распределение будет обрабатываться одним из методов init, но и здесь initWithInt: 5 - такая распространенная ситуация, что вместо создания нового объекта возвращается указатель на объект по умолчанию.И этот не может быть освобожден в любом случае.

// do it once
NSNumber* five1 = [NSNumber alloc];
NSLog(@"%p", five1);
five1 = [five1 initWithInt:5];
NSLog(@"%p", five1);

// and once more
NSNumber* five2 = [NSNumber alloc];
NSLog(@"%p", five2);
five2 = [five2 initWithInt:5];
NSLog(@"%p", five2);

На самом деле, не должно быть проблем с отправкой сообщения о выпуске более одного раза:

[five1 release];
[five1 release];
[five1 release];
0 голосов
/ 25 марта 2012

Я думаю, это не сработает, если вы установите 'a' в ноль, но пока оно указывает на какое-то место в куче и там есть целое число 5, вы получите это 5. Но если вы сделаете что-то междуРелиз и NSLog вы можете получить другой результат (любой вид мусора).

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