我是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并被释放吗?或者这是内存泄漏?
答案 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应该做什么。
如果你想看看保留计数如何增加和减少,请覆盖方法“释放”以打印出一些东西。但请记得称超级发布。
答案 4 :(得分:0)
当你初始化你的课程时,引擎的内存计数会增加一个(说你做初始化) 在你的setter中,需要保留新值并释放旧值(保留计数器随新值增加,然后计数器减少以消除旧值)。保留计数器仍然是1.
关闭程序时,还需要在dealloc函数中释放Engine,以确保不会出现任何内存泄漏。
监视内存泄漏的一个好方法是使用xcode中的“Leaks”工具:
跑 - >从Performance Tool开始 - >泄漏
其他方法是使用“构建和分析”工具查找潜在的内存泄漏:
构建>建立和分析
希望我是对的,我的目标-c有点生疏。