在 Objective-C 中使用 TBXML 时的内存泄漏

Posted

技术标签:

【中文标题】在 Objective-C 中使用 TBXML 时的内存泄漏【英文标题】:Memory leak when using TBXML in Objective-C 【发布时间】:2011-09-30 13:45:40 【问题描述】:

我是 Objective C 的新手,仍然不太清楚如何使用保留和释放。 在下面的代码中,我想使用 TBXML 来解析 XML 文件并填充 TableView。该代码有效,但是当我“分析”我的应用程序时,Xcode 说变量name 中存在内存泄漏。我想我应该在保留变量后释放它,但是,每当我试图释放它时,无论我在哪里做,它总是会产生错误。我也尝试不保留它,但它也产生了错误。

谁能解释一下这里发生了什么?

- (void)loadNews 

    TBXML * tbxml = [[TBXML tbxmlWithURL:[NSURL URLWithString:@"http://www.abc/def.xml"]] retain];

    // If TBXML found a root node, process element and iterate all children
    if (tbxml.rootXMLElement) 

        TBXMLElement *categoryElement = [TBXML childElementNamed:@"category" parentElement:[tbxml rootXMLElement]];

        do 
            NSString *name = [TBXML valueOfAttributeNamed:@"name" forElement:categoryElement];
            [name retain]; // Something wrong with this line?

            NewsCategory *newsCategory = [[NewsCategory alloc] initWithCategoryName:name];

            // get entries in the category
            TBXMLElement *entryElement = [TBXML childElementNamed:@"entry" parentElement: categoryElement];

            do 
                NSString *title = [TBXML textForElement:[TBXML childElementNamed:@"title" parentElement:entryElement]];
                NSString * icon = [TBXML textForElement:[TBXML childElementNamed:@"icon" parentElement:entryElement]];
                NSString * link = [TBXML textForElement:[TBXML childElementNamed:@"link" parentElement:entryElement]];
                NSString * desc = [TBXML textForElement:[TBXML childElementNamed:@"desc" parentElement:entryElement]];

                NewsEntry *newsEntry = [[NewsEntry alloc] init];
                newsEntry.title = title;
                newsEntry.icon = icon;
                newsEntry.link = link;
                newsEntry.desc = desc;

                [newsCategory addEntry:newsEntry];

                [newsEntry release];
             while((entryElement = entryElement->nextSibling));


            // save category
            [newsData addCategory:newsCategory];

            [newsCategory release];


         while((categoryElement = categoryElement->nextSibling));


    

    // release resources
    [tbxml release];


    [newsTableView reloadData];

【问题讨论】:

您的代码看起来不错。看起来你只需要在你打电话给[newsCategory release]的地方打电话给[name release]。那么,如果您不致电[name retain],您会看到错误吗?什么错误?它应该是一个自动释放的对象,因此您不必在此方法中保留/释放它。您的 txxml 变量也是如此 - 您也不应该保留/释放它(因为它是自动释放的)。 【参考方案1】:

如果创建[TBXML valueOfAttributeNamed: forElement:] 的人遵循命名约定,则该值应自动释放。你不需要保留它。

但是,您需要在[NewsCategory initWithCategoryName:]方法中保留或复制它。

【讨论】:

以上是关于在 Objective-C 中使用 TBXML 时的内存泄漏的主要内容,如果未能解决你的问题,请参考以下文章

TBXML 将复杂的 xml 解析为数组

iPhone TBXML 循环和解析数据

在objective-c中使用swift代码时的问题

在 Objective-C 中使用 AFNetworking 上传图像时出错

在 Objective-C 中使用 ARC 时 AutoRelease 是多余的吗?

在 Objective-C 类中使用时如何自定义 SDCAlertView