【问题标题】:Objective-c and memory leaks after a program terminates?程序终止后Objective-c和内存泄漏?
【发布时间】:2009-06-17 20:55:03
【问题描述】:

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

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

我担心的是:我不确定我是否正确理解了内存泄漏这个术语。这是否指没有正确释放内存,然后当我的应用程序关闭时有未使用的悬空内存?换句话说,当我的程序关闭时,Mac OS 并不能确保程序使用的所有内容都被清理干净了?

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

【问题讨论】:

    标签: objective-c memory-management memory-leaks


    【解决方案1】:

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

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

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

    NSMutableArray *array; //Pointer to some already allocated array
    
    [array addObject:someObject];
    [someObject release];
    

    假设someObject 被正确分配,它将以保留计数1 开始。当您将对象添加到数组时,该数组会调用相关对象上的retain,在这种情况下,将其提升为2.

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

    【讨论】:

      【解决方案2】:

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

      我写了一篇博文,了解 iPhone 的 Objective-C 内存管理。

      http://loufranco.com/blog/files/managing-memory-iphone.html

      还有一个关于 CLang 静态分析工具的工具,我发现它对于通过检查源来发现泄漏非常宝贵

      http://loufranco.com/blog/files/scan-build-iphone.html

      【讨论】:

        【解决方案3】:

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

        Apple 提供了一个很棒的工具“Instruments”,可让您跟踪和修复内存泄漏。我建议你时不时地运行你的应用程序来检查是否有泄漏。我已经到了这样的地步,当我调用 alloc 时,我总能找到要释放对象的位置。如果我调用 alloc 并且它不是自动释放,那么我必须找到放置释放的地方。

        【讨论】:

          猜你喜欢
          • 2011-06-07
          • 1970-01-01
          • 2013-05-23
          • 1970-01-01
          • 2011-06-07
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多