Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 目标c和程序终止后的内存泄漏?_Objective C_Memory Management_Memory Leaks - Fatal编程技术网

Objective c 目标c和程序终止后的内存泄漏?

Objective c 目标c和程序终止后的内存泄漏?,objective-c,memory-management,memory-leaks,Objective C,Memory Management,Memory Leaks,我是一名新的Objective-C程序员,来自C#、VB.NET等。这些都是垃圾收集语言,在大多数情况下,最糟糕的事情是滥用内存,因为当程序关闭时,内存会被运行时回收 但是,我不清楚Objective-C。我认为,作为一名开发人员,管理对象的分配、初始化、保留和发布在很大程度上取决于我们。我正在尽我最大的努力去做这件事,慢慢地想我已经掌握了窍门 我担心的是:我不确定我是否正确理解了“内存泄漏”这个术语。这是不是指没有正确释放内存,然后当我的应用程序关闭时,有未使用的悬空内存?换句话说,当我的程序

我是一名新的Objective-C程序员,来自C#、VB.NET等。这些都是垃圾收集语言,在大多数情况下,最糟糕的事情是滥用内存,因为当程序关闭时,内存会被运行时回收

但是,我不清楚Objective-C。我认为,作为一名开发人员,管理对象的分配、初始化、保留和发布在很大程度上取决于我们。我正在尽我最大的努力去做这件事,慢慢地想我已经掌握了窍门

我担心的是:我不确定我是否正确理解了“内存泄漏”这个术语。这是不是指没有正确释放内存,然后当我的应用程序关闭时,有未使用的悬空内存?换句话说,当我的程序关闭时,Mac操作系统不能确保程序使用的所有东西都被清除了吗


我希望这是有意义的,它真正有意义的是程序关闭后的差异,而不是程序运行时的内存。

不,当你退出应用程序时,操作系统应该释放所有内存。如果不处理内存泄漏,应用程序将崩溃。为了简单起见,假设这些设备有10mb的ram,并且每次调用函数时都会不断泄漏内存。迟早你会耗尽内存,你的应用程序会崩溃


苹果提供了一个很棒的工具“仪器”,可以让你追踪和修复内存泄漏。我建议你时不时地运行你的应用程序来检查漏洞。当我调用alloc时,我总能找到释放对象的位置。如果我调用alloc,但它不是自动释放,那么我必须找到放置释放的位置。

操作系统确实释放了内存,但在此之前您可能会泄漏内存。因此,如果您在关机时收到泄漏报告,那只是尚未释放的对象(但内存现在已回收)

我写了一篇关于理解iPhone的objective-c内存管理的博客文章

这是关于CLang静态分析工具的一个,我发现它对于通过检查源代码来发现泄漏非常有价值


我不确定是否正确理解了术语内存泄漏。这是否指未正确释放内存,然后当我的应用程序关闭时,有未使用的悬空内存?

没有;内存泄漏是指应用程序仍在运行时内存泄漏,因为当应用程序终止时,OS X会回收所有内存。如果不是这样的话,由于编码和内存管理不善,可能会造成巨大的问题,并会影响整个系统

它基本上是关于保留一个对象太多,或者没有释放足够的内存。例如,向数组添加对象时,这是一种常见的方法:

NSMutableArray *array; //Pointer to some already allocated array

[array addObject:someObject];
[someObject release];
假设
someObject
已正确分配,则它将以保留计数1开始。将对象添加到数组中时,数组会对所讨论的对象调用
retain
,在本例中,会将其增加到2

当一个数组被释放时,它向它的所有对象发送
release
;在这种情况下,retain计数将被减少到1(假设没有其他人保留该对象)。这不是0,因此
someObject
仍然存在。如果
someObject
是在方法内部创建的本地指针,而您不再有指向该对象的指针,那么内存将挂在那里。这是内存泄漏的一个例子,它会导致应用程序使用的内存超过它所需的内存,并且会受到影响,直到它被终止