2

我是 Objective-c 的新手,我已经从这里下载了代码。
第 10 章10.01 CarPartsInitxcode 项目文件。

我不清楚的一件事是,setter 方法的内存管理

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

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

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

4

5 回答 5

4

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

于 2010-06-22T02:48:58.813 回答
3

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

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

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

于 2010-06-22T01:41:36.073 回答
1

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

-(void) dealloc {
  [engine release]; // no need to set to nil in dealloc
  [super dealloc];
}
于 2010-06-22T01:54:08.257 回答
0

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

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

观察内存泄漏的一个好方法是在 xcode 中使用“Leaks”工具:
运行 -> Start with Performance Tool -> Leaks

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

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

于 2010-06-22T12:24:28.687 回答
0

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

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

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

于 2010-06-22T03:19:25.840 回答