【问题标题】:Invalid receiver type when releasing a variable释放变量时接收器类型无效
【发布时间】:2011-05-13 04:41:04
【问题描述】:

我正在学习很多关于内存管理的知识,但这个问题让我很疑惑。

在类方法中我创建了一个变量:

TBXMLElement *pieceXML = [TBXML childElementNamed:@"piece" 
                                parentElement:rootElement];

并在方法结束时释放它:

[pieceXML release];

但我得到了错误:Invalid receiver type 'TBXMLElement *'

childElementNamed:parentElement:的实现如下

+ (TBXMLElement*) childElementNamed:(NSString*)aName parentElement:(TBXMLElement*)aParentXMLElement{
    TBXMLElement * xmlElement = aParentXMLElement->firstChild;
    const char * name = [aName cStringUsingEncoding:NSUTF8StringEncoding];
    while (xmlElement) {
        if (strlen(xmlElement->name) == strlen(name) && memcmp(xmlElement->name,name,strlen(name)) == 0) {
            return xmlElement;
        }
        xmlElement = xmlElement->nextSibling;
    }
    return nil;
}

我正在尝试了解如何预测这种情况会再次发生,欢迎阅读任何参考资料,因为即使看过之后我也不知道如何找到原因。

谢谢。

【问题讨论】:

  • TBXMLElement 是声明释放方法的 NSObject 的后代吗?
  • 根据 Bavarious 的说法,它似乎是一个 C struct
  • here所述。

标签: iphone ios ios4 memory-management


【解决方案1】:

TBXMLElement 不是一个 Objective-C 类——而是一个 C struct

这意味着pieceXML 不是一个Objective-C 对象,因此你不能向它发送任何Objective-C 消息。特别是,你不能发送它-release

【讨论】:

  • 谢谢,那我该如何发布呢?还是根本不需要?
  • @Jero 据我所知,你不需要free(pieceXML)(类似于释放 Objective-C 对象)。看起来TBXML 拥有并释放它创建的所有对象/内存。
【解决方案2】:

您不需要释放从帮助方法(如childElementNamed:parentElement:)获得的对象,只有在分配或复制时才释放。有一些例外,但这是经验法则。

【讨论】:

  • 我也是这么理解的。如果最常见的情况不正确,您会提供一个好的提示吗?这将帮助我更好地绕过它。谢谢!
  • 好吧,具有(保留)或(复制)属性的属性也应该被释放。应该发布使用 [yourClassName new] 创建的项目。如果您使用池或自动释放,则无需释放。你可以找到gory details at this link
猜你喜欢
  • 2011-03-01
  • 2021-04-03
  • 1970-01-01
  • 2017-11-08
  • 1970-01-01
  • 1970-01-01
  • 2018-04-18
  • 1970-01-01
相关资源
最近更新 更多