【问题标题】:Memory management dilemma, Objective -C内存管理困境,Objective -C
【发布时间】:2011-08-23 15:20:56
【问题描述】:

我一直在测试 Objective -C 的不同特性,并找到了处理内存管理的主题。显然,在阅读了一些文档后,似乎内存管理对于构建功能良好的应用程序来说非常严格。

现在根据我的理解,当我们分配内存时,对象的retainCount 将变为1。然而,我为学习目的而写的东西给了我不正常的retainCount

这对我来说可能是异常的数字,但是知道幕后的人,你能解释一下我是如何得到这个retainCount的吗?最好的释放方法是什么。

retainCount异常的代码,

对象名称是:...(UISlider *) greenSender...

-(IBAction) changeGreen:(UISlider *)greenSender{
    showHere.textColor = [UIColor colorWithRed:red.value green:greenSender.value blue:blue.value alpha:1.0];
    NSLog(@"retainCount %d",[greenSender retainCount]);
}

在执行我的代码之后有reatainCount

一个简短的解释会给我一个提示,外部阅读资源将不胜感激。 谢谢

【问题讨论】:

  • 绿色发件人来自其他地方。为了弄清楚你的保留计数器来自哪里,我们需要使用该指针的其余部分。
  • 对不起,这只是一个 UISlider,参数传递给一个方法,现在是墨尔本凌晨 1:27...道歉。
  • 如果我不得不猜测我会说 greenSender 是您 UI 的一部分,因此 UI 组件将引用您的对象,因此保留计数为 8。

标签: iphone objective-c ios memory-management memory-leaks


【解决方案1】:

不要依赖保留计数。它们只能用作调试工具。原因是如果一个对象获得retained 和autoreleased,它的有效 保留计数没有改变,但它的实际 保留计数增加了1。将来自动释放池耗尽时,它将是released。因此,您不能依靠保留计数来了解对象是否被正确管理。

较大的保留计数(例如 8)可能表明存在编程错误(例如保留太多次),但也可能只是表明它已被 retained 和 autoreleased 多次,虽然很好奇,但可能是完全有效的。

【讨论】:

  • 有时有些东西看起来很有用但程序员很差,我可能会用自己的大脑来计算我通过或保留任何特定对象的时间:),谢谢
  • 你也不想自己计算这些东西......它不会帮助你调试任何东西。最好通过确保您符合内存管理约定来跟踪错误。如果您需要帮助调试内存问题的工具,请查看 NSZombies 和 Instruments。
  • 谢谢克里斯,让我google一下那些僵尸,在java之后直接用Obj-C编程是非常奇怪的体验。
【解决方案2】:

不要信任/依赖retainCount。真的。

来自苹果:

重要:此方法通常在调试中没有任何价值 内存管理问题。因为任何数量的框架对象都可能 保留了一个对象以保存对它的引用,而在 同时自动释放池可能持有任意数量的延迟 在一个对象上发布,你不太可能有用 来自此方法的信息。

【讨论】:

  • 这很有趣,感谢 Jilouc,但是 1+ 的努力,但我必须接受亚当的回答,因为他先说,谢谢
  • @krio 没问题,Adam 太快了 :)
猜你喜欢
  • 2016-09-12
  • 2020-01-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多