Objective-C:如果不释放对象,为什么重要?

时间:2011-11-13 21:00:43

标签: objective-c xcode memory-management

如果我正在搞乱XCode并尝试学习Objective-C,如果我经常忘记释放对象,它是否对我的系统造成任何威胁?不释放物体的真正后果是什么?如果我重新启动计算机,这些内存泄漏会持续存在吗?

我主要是在搞乱NSStrings和NSTimers以及类似的东西,没什么大不了的。我只是担心它弄乱了我的电脑。

有没有办法检查是否有未发布的对象?如果他们想检查一堆代码以查看是否存在任何这些内存泄漏,该怎么办?

5 个答案:

答案 0 :(得分:6)

首先:所有进程都在自己的虚拟内存中运行,因此当您终止进程时,无论有多少泄漏,都会将内存返回给系统。

二。通过不释放对象,无法告诉系统应该释放对象,这就是为什么所有分配的对象都将保留在内存中,即使它们已经不必要了。

尝试从C之类而不是Objective C开始,因为我很明显你不知道指针,RAM等是什么。

答案 1 :(得分:6)

唯一的“威胁”是你的程序会占用大部分可用内存,这会导致计算机运行缓慢,硬盘驱动器会崩溃,直到系统在程序结束时回收内存。当程序使用更多内存时,它会使事情变得非常不愉快。没危险 - 真的很烦人。

答案 2 :(得分:4)

请不要担心,当您的程序结束(或崩溃)时,操作系统将回收您泄漏的任何内存。

Instruments中的泄漏和对象分配工具将帮助您找到内存管理错误。此外,静态分析器(Build-> Analyze)非常有用。

答案 3 :(得分:3)

您不仅会占用适用于您应用的内存,还会占用系统上所有其他应用的内存。如果您占用所有可用内存,Mac OS X也会开始将其他应用程序移动到虚拟内存中,使 整台计算机 变慢,而不仅仅是您的应用程序。

在iOS设备上,如果您使用过多的内存,操作系统将终止您的应用,不会向用户发送错误消息,也无法保存任何文件。

如果真的很糟糕,应用商店评论小组会拒绝您的应用甚至提交到商店。这适用于iOS应用商店和Mac应用商店。

您可以使用Instruments app to check for leaks

一般的经验法则是,只要您使用名称以allocnewretaincopy开头的方法,您就有责任致电{当不再需要该对象时,{1}}或release。并且您的对象的autorelease方法需要清除所有实例变量。

最新版本的Mac OS X和iOS支持Automatic Reference Counting。我从来没有使用它,但它应该让新程序员的生活更轻松。

答案 4 :(得分:1)

不,忘记释放物品不会伤害您的机器。除了删除系统文件之外,用软件损坏机器的能力很小。

正如其他人所指出的那样,当程序终止时,程序使用的所有内存都将被回收。如果您想在程序运行时检查程序是否存在泄漏,可以使用Xcode附带的Instruments工具对其进行监控。我不会在这里解释如何使用它 - 阅读文档并询问您是否遇到问题。

您还可以通过使用命令行top程序监视其内存使用情况,获取应用程序泄漏内存的一些线索。如果应用程序的内存使用量在您使用时不断增加,则表明可能存在泄漏。