何时以及为什么我必须使用发布?

时间:2011-08-04 06:53:29

标签: objective-c ios xcode release

我通过观看教程和尝试来学习objective-c和xcode,所以我自己。我从来没有真正与老师或类似的东西上课。而且我从未学习release用于什么。我经常看到它,当然但我想知道一些关于它的事情。我是否必须在- (void)dealloc的头文件中为我声明的每个对象使用release?如果我在IBAction中创建临时NSString,我必须在操作结束时释放它吗?如果我不使用发布会怎么样?发布在编程语言中的意义何在?

2 个答案:

答案 0 :(得分:5)

规则非常简单:只有在使用newallocretaincopy(简称NARC)获取对象时才需要发布对象。而已。一旦你完成了NARC对象并且你不再需要它,你必须release它。如果您通过任何其他方式获得了该对象,那么您不能release它。

如果您在类初始化的某个地方通过NARC获取了一个对象,并且您需要在类实例的生命周期内保留此对象,那么release方法中的dealloc。这将确保对象的生命尽可能多,并在类的实例消亡后死亡。

在Objective-C中,每个实例都包含一个引用计数属性。使用NARC创建对象时,此引用计数为1.每个连续的retain将引用计数增加1.每个连续的release将引用计数减少1.当引用计数达到0时,该对象被解除分配。

因此,如果你不释放NARC对象,那么你将有一个内存泄漏(因为引用计数将保持在0以上,并且永远不会释放对象,即使你完成了它)。这意味着你的应用程序将在内存中拥有一个永远不会使用的空间。如果这些加起来,那么你将浪费大量宝贵的系统资源。在iOS上,这可能会让您的应用程序死亡。

如果您需要返回使用NARC创建的对象,那么您应该autorelease它。这基本上意味着“对象将在稍后调用release”。因此,如果调用方法的方法需要保存此对象,则它可以retain它,现在该对象的引用计数设置为2.稍后将调用release,按计划,但对象为retain,其引用计数将为1,并且不会死亡。现在调用者有责任在完成后调用release

答案 1 :(得分:1)

您可能会从阅读Objective-C中的内存管理基本概念(分配,引用计数,保留/释放/自动释放......)中受益。

Apple provides a nice introduction here.

这个主题很容易让新手和有经验的程序员感到困惑,你可以通过深入了解它来帮助自己。

这真的不是10行中可以解释的东西。但是,开始阅读上面的文档,您就可以更好地理解Cocoa中的内存管理了。