【问题标题】:Using Instruments for Memory Leak Checking in XCode?在 XCode 中使用 Instruments 进行内存泄漏检查?
【发布时间】:2011-08-02 10:16:37
【问题描述】:

美好的一天,

我在检查内存泄漏方面完全没有经验,因此对此提供任何帮助都会很棒。

我刚刚完成了我的 iPhone 应用程序的大部分工作,我现在正试图弄清楚为什么它在运行几次后停止工作。在 Leaks and Allocations 模式下使用 Instruments 我可以看到有两个对象正在快速堆积内存并且没有释放:

我不是百分百确定发生这种情况的地点或原因,但是当我单击 UIDeviceRGBColor 右侧的箭头时,负责任的调用者会被声明为

[UIColor allocWithZone];

我在我的项目中搜索了 UIColor 并找到了这个(注意 _colorThreshold):

我相信我的问题与似乎没有被释放的 _colorThreshold 有关:

我尝试将自动释放添加到它们的初始化参数中,但这会使应用程序崩溃。这里有什么建议吗?


编辑 1

这是来自 LevelMeter.h 的屏幕截图

【问题讨论】:

  • 不是一个直接的答案,但this video from iDeveloper.tv 有一些关于objective-c 内存管理的重要指导规则,这可能会对您未来的项目有所帮助。

标签: iphone objective-c memory memory-leaks instruments


【解决方案1】:

上面有几个问题:

  • LevelMeterColorThreshold 是一个 Objective-C 类吗?
  • 如果是这样,为什么要使用 malloc 而不是通常的 alloc/init?
  • 当您粘贴搜索结果的屏幕截图时,我们看不到周围的代码,因为只显示搜索命中的行。

Leaks 仪器是否报告泄漏,或者您只是分配了不必要的内存?
这两种情况是有区别的:

  1. 如果您对某个对象的引用丢失,导致您以后无法向其发送release 消息,则会发生泄漏。
  2. 实例化对象,不再需要释放/释放它们

泄漏只能检测到第一种情况。
泄漏样本:

NSMutableString* test = [[NSMutableString alloc] initWithString:@"1"];
NSLog(@"%@", test);
NSMutableString* anotherTest = [[NSMutableString alloc] initWithString:@"2"];
test = anotherTest; //here we loose reference to the original object
NSLog(@"%@", test);

通过将 anotherTest 分配给 test,我们丢失了指向包含 @"1" 的内存地址的引用。

【讨论】:

  • 感谢您的反馈!我是初学者,所以不确定它是否是 Objective-C 类(Objective-C 对象中是否允许使用结构?)。我已经发布了 LevelMeter 的 .h 文件。这是否澄清了我的问题可能是什么?再次感谢。
  • 我找到了问题的根源。感谢您把一切都放在眼里!
猜你喜欢
  • 2011-03-08
  • 2010-10-09
  • 2015-09-14
  • 2011-10-10
  • 2012-12-28
  • 2011-08-17
  • 2012-01-02
  • 2019-06-20
  • 1970-01-01
相关资源
最近更新 更多