2012-03-25 3 views
2

Почему этот кусок коды работает:Почему он не падает?

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

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

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

+4

Чисто предположение, как я не разработчик Objective-C, но я бы сказал, что объект, на который указывает, может быть освобожден, но упомянутая ячейка памяти все еще содержит значение 5. –

ответ

2

Я думаю, что 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

да, я попытался выпустить его еще раз, и программа не сработала! – LuisEspinoza

0

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

2

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

Однако, поскольку это теперь «мертвая» память, вероятно, что последующее распределение будет повторно использовать этот блок памяти.

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

+0

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

Смежные вопросы