【问题标题】:Obj-C Memory Management Setter MethodObj-C 内存管理设置方法
【发布时间】:2011-03-06 14:27:54
【问题描述】:

我是 Objective-c 的新手,我已经从 here 下载了代码。
Ran 第 10 章,10.01 CarPartsInit xcode 项目文件。

我不清楚的一点是,setter 方法的内存管理是否

- (void) setEngine: (Engine *) newEngine
{
    [newEngine retain] 
    [engine release];
    engine = newEngine;
}

在程序结束时,引擎retainCount 的结果应该为 0。

我运行了一些NSLog,当程序结束时...引擎的retainCount 为1... 它应该变为 0 并被释放吗?还是这是内存泄漏?

【问题讨论】:

    标签: objective-c memory-management retaincount


    【解决方案1】:

    没有必要在程序退出前释放所有东西。操作系统会自动回收程序使用的所有内存。

    通常不用担心在程序期间存在的对象。如果你创建了一些东西,然后在释放它之前丢失了引用,你真的只有内存泄漏。

    注意:如果程序没有在终止前清理每个对象,你可能会遇到一些白痴,他们声称程序在某种程度上是“错误的”。你可以忽略那些人。

    【讨论】:

    • 如果它在 iPhone 上,操作系统会处理它吗?因为避免自动释放和不支持 GC 很重要?当这些内存没有被释放时,它会占用应用程序吗?
    • 没关系。一旦程序终止,与该程序相关的所有资源都会被回收。
    • @tmlee:操作系统将在进程终止时回收进程的内存。在我所知道的每一个现代计算机平台上都是如此,包括 iPhone。
    • 避免自动释放并不是真正的“关键”。如果避免它,您可能会获得更好的性能,但除非您一次自动释放数以亿计的对象,否则这不会成为问题。
    【解决方案2】:

    实例保留(或分配)的所有内容都应在 dealloc 中释放。

    -(void) dealloc {
      [engine release]; // no need to set to nil in dealloc
      [super dealloc];
    }
    

    【讨论】:

      【解决方案3】:

      您不必担心保留计数。你甚至不应该看他们。它们太令人困惑了——它们实际上是一个私有的实现细节。恰当的例子:没有对象的保留计数会变为零。为什么?因为没有意义。保留计数为 0 的对象将是一个已释放的对象,向已释放的对象发送消息是一个错误(它可能会报告旧值 1,或者它可能会报告完全不同的东西,或者它可能会使您的程序崩溃) .只要您关注memory management guidelines 并且 Instruments 没有报告任何泄漏,您应该感觉良好。

      【讨论】:

        【解决方案4】:

        让我们看看 setEngine 应该做什么。

        1. 有人传入了一个新引擎,而你想使用它。所以你需要“保留”它。
        2. 你的车可能已经有引擎了。所以你释放它。 (注意,向 null 发送 release 消息什么都不做)
        3. 然后将传入的参数“newEngine”分配给汽车的属性“engine”。完成。

        如果您想查看保留计数如何增加和减少,请覆盖方法“释放”以打印出一些内容。但是记得调用super的release。

        【讨论】:

          【解决方案5】:

          当你初始化你的类时,引擎的内存计数会增加一(说你确实初始化了它)。
          在您的设置器中,需要保留新值并释放旧值(保留计数器随着新值增加,然后计数器减少以摆脱旧值)。因此,保留计数器仍为 1。

          关闭程序时,您还需要在您的 dealloc-function 中释放 Engine,以确保不会出现任何内存泄漏。

          监视内存泄漏的一个好方法是使用 xcode 中的“Leaks”工具:
          运行 -> 从性能工具开始 -> 泄漏

          其他方法是使用“构建和分析”工具来查找潜在的内存泄漏:
          构建 > 构建和分析

          希望我是对的,我的 Objective-c 有点生疏了。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2010-09-27
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多