2010-07-22 57 views
3

我想问一个关于iPhone应用程序的愚蠢问题。我是iPhone应用程序的绿色。我在Apple网站上阅读了以下代码。在iPhone上这种情况下'释放'是什么意思?

MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]]; 
    [self setMyViewController:aViewController]; 
    [aViewController release]; 

我有一个问题,它是如何意味着在第3行'释放'?

它是否显示记忆清晰?或程序是否控制该对象?或其他含义。非常感谢你。

回答

5

当你的某个东西,你得到的对象将有一个保留计数为1 - 这意味着这个对象目前正在被某人使用,所以它不应该从内存中删除。如果你在一个对象上调用retain它将增加保留计数,这意味着对象被2件事情使用。如果保留计数达到0,则意味着该对象不再被任何东西占用,并且可以从内存中移除该对象。您可以通过在对象上调用release来减少对象的保留计数。

在您的示例中,aViewControlleralloc'd,并且第1行之后的保留计数为+1。

然后将其设置为第2行中的视图控制器。此方法用于取得对象的所有权,因此应该为其自身使用retain

第3行,我们不希望更多的与视图控制器有关,所以我们release我们认为它。保留计数减1 - 现在由新所有者在完成时释放它。

您可能会发现它有用通过this tutrial

+0

保留计数是一个实现细节。忘掉它们。所有版本都会向运行时发出信号,表示您已放弃对该对象的兴趣。保留计数就是运行时跟踪谁对对象感兴趣的方式,以便在没有人时可以释放它。 – JeremyP 2010-07-22 13:39:51

+0

谢谢你的回复。什么是对象上的“保留”?它是否等于对象声明或启动?如果保留数是3,我需要调用[发布] 3次?你的意思是在第1行之后count是1,在第2行之后count是2,在第3行之后count又回到1?如果是,谁是该对象的所有者或用户?谢谢。 – Questions 2010-07-23 01:29:43

2

无论何时您致电alloc,您都拥有对返回对象的引用,并且您必须致电release来表明您不再打算使用该引用。

在上述情况下,您已经分配了一个新的视图控制器并将其分配给您的类的一个属性。假设该属性声明为retain选项,则该属性将通过其上的retain获取对视图控制器的引用。所以现在有两个主动引用它。该属性将最终发布其引用(当它被分配了不同的视图控制器,或者当你的类被定型时)。但是如果你不自己释放,一个引用将会保留,并且视图控制器将永远不会被释放。

总之,你必须匹配每个分配一个发布,否则事情会泄漏。

+0

的存储器管理部分阅读感谢您的回复。它是否与decalloc中的函数相同? – Questions 2010-07-22 10:30:42

+0

不,仅释放对象的保留计数并在其达到零时调用-dealloc。 -dealloc是释放实例变量并释放属于该对象的资源的方法。 – Costique 2010-07-22 10:45:05

相关问题