我想问一个关于iPhone应用程序的愚蠢问题。我是iPhone应用程序的绿色。我在Apple网站上阅读了以下代码。
MyViewController *aViewController = [[MyViewController alloc] initWithNibName:@"MyViewController" bundle:[NSBundle mainBundle]];
[self setMyViewController:aViewController];
[aViewController release];
我有一个问题,第3行中“释放”的含义是什么?
它是否显示内存清晰?或程序控制该对象?或其他含义。非常感谢你。
答案 0 :(得分:5)
当你alloc
某事时,你得到的对象的保留计数为1 - 这意味着此对象当前正由某人使用,因此不应将其从内存中删除。如果在对象上调用retain
,它将增加保留计数,这意味着该对象被两件事物使用。如果保留计数达到0,则意味着该对象不再被任何东西使用,并且可以从内存中删除它。您可以通过调用对象上的release
来减少对象的保留计数。
在您的示例中,aViewController
为alloc
'd,第1行后的保留计数为+1。
然后将其设置为第2行中的视图控制器。此方法用于获取对象的所有权,因此retain
将其用于自己的用途。
第3行,我们不希望与视图控制器有任何关系,所以我们release
持有它。保留计数减少一个 - 现在由新的所有者在它完成时释放它。
您可能会发现阅读this tutrial
的内存管理部分会很有帮助答案 1 :(得分:2)
每当您致电alloc
时,您拥有对返回的对象的引用,您必须致电release
以表明您不再打算使用该引用。
在上面的例子中,您已经分配了一个新的视图控制器并将其分配给您的类的属性。假设使用retain
选项声明属性,该属性将通过调用retain
获取对视图控制器的自己的引用。所以现在有两个活跃的引用。该属性最终将释放其引用(在分配不同的视图控制器时,或者在您的类完成时)。但是如果你不自己调用release,那么将保留一个引用,并且永远不会释放视图控制器。
简而言之,您必须将每个alloc与一个版本匹配,否则会发生泄漏。