【问题标题】:Objective-C Memory Leak on addSubviewaddSubview 上的 Objective-C 内存泄漏
【发布时间】:2013-12-11 18:09:41
【问题描述】:

泄漏工具警告我与这部分代码相关的内存泄漏:

[self.contview addSubview:nav.view];

以下是我管理视图的方式:

    [nav.view removeFromSuperview];
    self.nav = [[[destinationClass alloc] initWithNibName:pagename bundle:nil] autorelease];
   [self.contview addSubview:nav.view];

self.nav 刚分配完之后,retainCount 为 2 正常吗?会不会和内存泄露有关?

我对内存管理很陌生,有人可以帮我吗?

非常感谢

【问题讨论】:

  • 你能发布所有相关的代码吗?这一切对我来说看起来有点奇怪,但没有上下文就很难说。
  • www.whentouseretaincount.com -- retainCount 无关紧要。使用分配工具查看每个保留/释放事件的堆栈跟踪。

标签: ios iphone objective-c memory-leaks


【解决方案1】:

假设nav 是一个强(保留)属性,它会保留您在此处分配的视图控制器:

self.nav = [[[destinationClass alloc] initWithNibName:pagename bundle:nil] autorelease];

实际上,这行代码之后的保留计数为 1; +2 表示 allocretain,-1 表示 autorelease。通常你永远不应该使用retainCount 方法来确定对象的实际保留计数,也许this answer 会给你更多的洞察力。 每个allocretaincopy 调用都应与releaseautorelease 调用匹配。您应该在类的 dealloc 方法中添加匹配的发布调用

-(void) dealloc {
    [_nav release];
    _nav = nil;
    [super dealloc];
}

不要使用手动内存管理,使用 ARC,它会让你的生活更轻松:)

【讨论】:

  • 当然,RC 的值 2 实际上并不反映 autorelease,因此它实际上是 1。但巧合的是,它可能是 42,但仍然有效。绝对保留计数是没有意义的。实际上,alloc 为 +1,self.nav = 为 +1,自动释放为 -1,在执行该行代码后产生 +1(因此,在其他地方需要 -1 才能使此代码正确)。请注意,您可能应该使用[_nav release];self.nav = nil; 来防止悬空指针。
  • 你是对的,在分配、保留和自动释放之后,保留计数实际上是 1,现在我再次阅读我的答案,我明白你要指出的内容。我会稍微改写一下:)
  • dealloc 会崩溃;只需使用[_nav release]; _nav = nil;self.nav = nil;,但不要将两者混用。 一般模式是直接在dealloc释放实例变量,在init直接赋值。 (好的编辑,顺便说一句!谢谢)
  • 但是为什么泄漏仪器说泄漏问题在这行代码中:[self.contview addSubview:nav.view];
  • 对不起,我怎么能用 ARC 做同样的事情?只需删除自动释放,对吗?
猜你喜欢
  • 2011-06-07
  • 1970-01-01
  • 2011-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-17
相关资源
最近更新 更多