0

我对 Objective-C 中的内存管理有疑问。

-(void)viewDidLoad
{
NSNumber *num=[[NSNumber alloc] initWithInt:10];
[num release];
NSLog(@”%i”,num);
}

通过打印值,上面的代码可以正常工作。但是一旦对象被释放,它就失去了它的价值,对吧?那它怎么能正常工作呢?

4

2 回答 2

1

这是正在发生的事情。首先你这样做:

NSNumber *num=[[NSNumber alloc] initWithInt:10];

您的num变量现在包含一个指向NSNumber对象的指针,并且(因为您使用了alloc)您拥有该对象。然后你这样做:

[num release];

当您发送release到该对象时,您放弃了对它的所有权。该对象可能仍然存在并且未更改,或者它可能已被销毁。你不知道。您的num变量仍然包含相同的指针,但它指向的内存现在可能不是有效对象,因此您无法安全地向该对象发送消息。

然后你这样做:

NSLog(@”%i”,num);

在此NSLog语句中,您将num其视为整数而不是指针,因为%i格式化整数。您只是在打印NSNumber对象所在的地址(内存位置)(并且可能仍然存在 - 您不知道)。因此,是否num指向有效对象并不重要;您只是将num其视为任意整数。您没有尝试向NSNumber对象发送任何消息。

于 2012-08-02T04:25:50.353 回答
-1
  1. 通过在对象上调用 [release],我们可以减少对象的保留计数。
  2. 如果对象是通过调用其中包含 copy、new、alloc 的方法创建的,则调用者被称为该对象的所有者,并且所有者应始终释放拥有的对象。
  3. 如果您不拥有该对象,则不应释放它。
  4. 保留对象时始终调用对象的释放,这意味着如果调用保留方法,则应调用相应的释放调用。应匹配保留释放。
于 2012-08-02T04:10:14.080 回答