【问题标题】:UIView retainCount is 0, but the memory isn't releasedUIView的retainCount为0,但内存没有释放
【发布时间】:2012-09-11 13:21:57
【问题描述】:

我正在为 iOS 开发一个应用程序,但遇到了内存不足警告的问题。

点击按钮后,我的应用正在加载一个包含大量子视图的大视图。内存使用量增长,这是可以理解的(从 30 Mb 到 80Mb)。然而,当用户选择另一个菜单项时——这个视图被释放了,但是!应用程序使用的内存量不会减少。我使用以下代码释放视图:

storeView.hidden = YES;
NSLog(@"%d", [storeView retainCount]);
[storeView removeFromSuperview];
storeView = nil;

第二行中的 NSLog 打印:1,因此在发布后它应该被释放。我的 -(void) dealloc 的实现;确实被调用了(我在它的最后一行调用了 [super dealloc]; )。然而在那之后我仍然有内存不足的警告。

仪器只发现了几个泄漏的 NSString,这不可能导致内存警告。

您能给点建议吗?

【问题讨论】:

  • 忘记retainCount属性,永远不要使用它
  • 这很有帮助,谢谢。还有什么建议吗?该对象确实被释放 - 它的 dealloc 方法被调用。然而内存并没有被释放。
  • 内存不是由视图本身消耗的,而是由视图所持有的对象消耗的。当您的dealloc 被调用时,请查看您是否正在释放视图引用的对象。使用内存分析器运行,看看内存去了哪里。
  • 请注意,retainCount 根据定义,永远不会返回 0。

标签: objective-c ios memory-management uikit


【解决方案1】:

释放调用会降低保留计数,如果保留计数为 0,它可能会被清除,但并非必须如此。当保留计数为零并且您尝试访问变量时,它可能仍然有效,也可能无效。无论哪种方式,你都不能指望它。

【讨论】:

  • 也许我应该更好地命名我的问题。关键是即使调用了相应视图的dealloc方法,内存使用量也不会减少。
  • 那么导致内存警告的不是这个视图。
猜你喜欢
  • 1970-01-01
  • 2018-08-27
  • 2012-02-03
  • 1970-01-01
  • 2016-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多