我对 Objective-C 中的内存管理有疑问。
-(void)viewDidLoad
{
NSNumber *num=[[NSNumber alloc] initWithInt:10];
[num release];
NSLog(@”%i”,num);
}
通过打印值,上面的代码可以正常工作。但是一旦对象被释放,它就失去了它的价值,对吧?那它怎么能正常工作呢?
我对 Objective-C 中的内存管理有疑问。
-(void)viewDidLoad
{
NSNumber *num=[[NSNumber alloc] initWithInt:10];
[num release];
NSLog(@”%i”,num);
}
通过打印值,上面的代码可以正常工作。但是一旦对象被释放,它就失去了它的价值,对吧?那它怎么能正常工作呢?
这是正在发生的事情。首先你这样做:
NSNumber *num=[[NSNumber alloc] initWithInt:10];
您的num
变量现在包含一个指向NSNumber
对象的指针,并且(因为您使用了alloc
)您拥有该对象。然后你这样做:
[num release];
当您发送release
到该对象时,您放弃了对它的所有权。该对象可能仍然存在并且未更改,或者它可能已被销毁。你不知道。您的num
变量仍然包含相同的指针,但它指向的内存现在可能不是有效对象,因此您无法安全地向该对象发送消息。
然后你这样做:
NSLog(@”%i”,num);
在此NSLog
语句中,您将num
其视为整数,而不是指针,因为%i
格式化整数。您只是在打印NSNumber
对象所在的地址(内存位置)(并且可能仍然存在 - 您不知道)。因此,是否num
指向有效对象并不重要;您只是将num
其视为任意整数。您没有尝试向NSNumber
对象发送任何消息。