【问题标题】:NSXMLParser 's delegate and memory leakNSXMLParser 的委托和内存泄漏
【发布时间】:2010-05-05 21:48:52
【问题描述】:

我在我的程序中使用了一个 NSXMLParser 类,并为它分配了一个委托。 但是,这个委托被 setDelegate: 方法保留,导致了一个轻微但令人讨厌的 :-) 内存泄漏。

setDelegate 后无法释放委托类:因为程序会崩溃。

这是我的代码:

self.parserDelegate = [[ParserDelegate alloc] init]; //retainCount:1
self.xmlParser = [[NSXMLParser alloc] initWithData:self.xmlData];
[self.xmlParser setDelegate:self.parserDelegate]; //retainCount:2
[self.xmlParser parse];
[self.xmlParser release];

ParserDelegate 是委托类。

当然,如果我将 'self' 设置为委托,我不会有任何问题,但我想知道是否有办法使用不同的类作为委托而不会泄漏。

提前谢谢你。

【问题讨论】:

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


    【解决方案1】:

    来自 setDelegate 上的documentation

    “一个对象,它是新的委托。它不被保留。委托必须符合 NSXMLParserDelegate 协议协议。”

    所以不用担心。此外,即使它被保留,适当的 NSXMLParser 类也会在“dealloc”中释放委托。所以我认为你没有泄漏。

    您崩溃的原因是您正在释放委托,因为您将保留计数降至 0。

    【讨论】:

    • 所以即使它在 Instruments 中显示为泄漏我也不应该担心?另外,由于我在 'setDelegate:' 方法(根据 Instruments)之后得到了 retainCount:2,所以计数何时变为 0?
    • 获得第二次保​​留很奇怪。你说如果你在上面的代码中有那个版本,或者当你添加第二个版本来抵消 2 保留计数时它会崩溃?如果是后者,听起来像是有别的东西在保留它。
    • 第一个。如果我在 [self.xmlParser 发布] 之后立即释放它,它会崩溃。可能是仪器工具中的一些错误吗?我似乎无法理解“setDelegate”如何保留委托...
    • 哦!我知道(抱歉耽搁了)。您的“parserDelegate”属性是如何定义的?当您通过“self.parserDelegate”访问它时,它将保留它,然后自动释放它,因此保留计数为 2。但是,如果您释放它,您将在下次自动释放池耗尽时崩溃(可能是下一次事件循环运行)
    • 是的,我通过“self.parserDelegate”访问它。所以,现在它完全有道理。谢谢你的帮助鲍勃:-)。
    【解决方案2】:

    如果您将属性parserDelegate 设置为retain 并使用合成方法(通过使用self)进行初始设置,那么这可能是您的泄漏。

    【讨论】:

      猜你喜欢
      • 2011-02-09
      • 2016-05-09
      • 2010-12-29
      • 2011-02-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-12
      • 1970-01-01
      相关资源
      最近更新 更多