Obj-C内存管理设置方法

时间:2010-06-22 01:38:52

标签: objective-c memory-management retaincount

我是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并被释放吗?或者这是内存泄漏?

5 个答案:

答案 0 :(得分:4)

你不应该担心保留计数。你甚至不应该看他们。它们太混乱了 - 它们实际上是一个私有的实现细节。例证:没有对象的保留计数永远为零。为什么?因为没有意义。保留计数为0的对象将是一个解除分配的对象,并且将消息发送到解除分配的对象是一个错误(它可能会报告旧的值1,或者它可能会报告完全不同的内容,或者它可能会使程序崩溃) 。只要您关注memory management guidelines并且仪器没有报告任何泄漏,您应该感觉良好。

答案 1 :(得分:3)

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

通常不担心程序持续时间内存在的对象。如果你创建了一些内容但是在释放之前丢失了引用,那么你真的只有内存泄漏。

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

答案 2 :(得分:1)

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

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

答案 3 :(得分:0)

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

  1. 有人通过了一个新的发动机,你想要使用它。所以你需要“保留”它。
  2. 你的车可能已经有了发动机。所以你发布它。 (注意,将发布消息发送到null不执行任何操作)
  3. 然后您将传入的参数“newEngine”分配给汽车的属性“engine”。完成。
  4. 如果你想看看保留计数如何增加和减少,请覆盖方法“释放”以打印出一些东西。但请记得称超级发布。

答案 4 :(得分:0)

当你初始化你的课程时,引擎的内存计数会增加一个(说你做初始化) 在你的setter中,需要保留新值并释放旧值(保留计数器随新值增加,然后计数器减少以消除旧值)。保留计数器仍然是1.

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

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

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

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