我通过观看教程和尝试来学习objective-c和xcode,所以我自己。我从来没有真正与老师或类似的东西上课。而且我从未学习release
用于什么。我经常看到它,当然但我想知道一些关于它的事情。我是否必须在- (void)dealloc
的头文件中为我声明的每个对象使用release?如果我在IBAction中创建临时NSString,我必须在操作结束时释放它吗?如果我不使用发布会怎么样?发布在编程语言中的意义何在?
答案 0 :(得分:5)
规则非常简单:只有在使用new
,alloc
,retain
或copy
(简称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中的内存管理了。