使用TBXML textFromElement时内存泄漏

时间:2011-05-10 17:17:05

标签: iphone xml ios memory-management memory-leaks

我使用TBXML从我的方法接收内存泄漏来解析XML文件。

它给了我NSCFString'泄漏的对象'。当我查看堆栈跟踪时,它的最后一次调用是使用TBXML方法textForElement;用于获取元素中的字符串。

如果我点击跟踪,它会从TBXML类文件中将我带到此方法:

+ (NSString*) textForElement:(TBXMLElement*)aXMLElement {
    if (nil == aXMLElement->text) 
        return @"";
    return [NSString stringWithCString:&aXMLElement->text[0] encoding:NSUTF8StringEncoding];

以下是使用textForElement的方法之一:

- (NSMutableArray *)parseNewsXML
{

NSString *newsURL = @"http://www.millersville.edu/news/rss.php";

NSMutableArray *newsArray = [[NSMutableArray alloc] init];

EventArticleObject *currentArticle = [[EventArticleObject alloc] init];


tbxml = [TBXML tbxmlWithURL:[NSURL URLWithString:newsURL]];
rootXMLElement = tbxml.rootXMLElement;

if(rootXMLElement)
{
    node_channel = [TBXML childElementNamed:@"channel" parentElement:rootXMLElement];

    if(node_channel)
    {
        node_item = [TBXML childElementNamed:@"item" parentElement:node_channel];

        while(node_item)
        {
            node_traverse = [TBXML childElementNamed:@"title" parentElement:node_item];
            NSString *title = [TBXML textForElement:node_traverse];
            title = [title stringByReplacingOccurrencesOfString:@""" withString:@"\""];


            [currentArticle setTitle:title];
            node_traverse = [TBXML childElementNamed:@"link" parentElement:node_item];
            NSString *link = [TBXML textForElement:node_traverse];
            [currentArticle setLink:link];
            [currentArticle setDate:nil];

            [newsArray addObject:currentArticle];
            node_item = node_item -> nextSibling;
        }
    }
}
[currentArticle release];
return newsArray;
}

这是第二种也接收相同泄漏的方法:

- (void)parseMuAlertXML
{

time_t unixTime = (time_t) [[NSDate date] timeIntervalSince1970];

NSURL *url = [NSURL URLWithString:@"http://www.millersville.edu/alert/alert.xml"];

tbxml = [TBXML tbxmlWithURL:url];
rootXMLElement = tbxml.rootXMLElement;

if(rootXMLElement)
{
    node_alert = [TBXML childElementNamed:@"alert" parentElement:rootXMLElement];

    if(node_alert)
    {
        node_traverse = [TBXML childElementNamed:@"startdate" parentElement:node_alert];
        NSInteger startString =  [[TBXML textForElement:node_traverse] intValue];
        time_t startTime = startString;

        node_traverse = [TBXML childElementNamed:@"enddate" parentElement:node_alert];
        NSInteger endString =  [[TBXML textForElement:node_traverse] intValue];
        time_t endTime = endString;

        node_traverse = [TBXML childElementNamed:@"type" parentElement:node_alert];
        alertType = [[TBXML textForElement:node_traverse] retain];

        node_message = [TBXML childElementNamed:@"message" parentElement:node_alert];

        if(node_message)
        {
            node_traverse = [TBXML childElementNamed:@"p" parentElement:node_message];
            alertMessage = [TBXML textForElement:node_traverse];
            alertMessage = [[alertMessage stringByReplacingOccurrencesOfString:@" " withString:@" "] retain];
        }

        if((unixTime >= startTime) && (unixTime <= endTime))
        {
            [alertButton setHidden:NO];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
        } else {
            [alertButton setHidden:YES];
            [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:0.01]];
        }
    }
}
}

有谁看到那里出错了什么? 感谢。

2 个答案:

答案 0 :(得分:0)

您已分配 newsArray 并在该功能中将其返回。您是否在以后发布它,在哪里使用它?

该工具似乎无法理解这一点。它认为你分配并且没有发布它。

理想情况下,您应该自动释放需要从函数返回的对象。

答案 1 :(得分:0)

你当前的文章设定者可能就是这样。

您应该使用@synthesizer使这更容易一些,否则请确保复制字符串,释放旧字符串,并让当前文章处理内存。如果你这样做:

@implementation CurrentArticle

- (void) setLink:(NSString*)value;
{
     link = value; //You will either get a pointer to a value that belongs in another class, like pointing to an array instead of copying it, and changing the value, you'll be like "Why did it change?"

///////////// OR THIS:
      if(link) {
    [link release];
    } 
    link = [value copy];
    [value release];
}

合成器处理这个问题,可能更优雅。

但是,我在上面的代码中没有看到你的问题所在,它似乎是整个方式的自动释放值。

是的,我知道这是旧的,但这就是我要看的地方,我相信其他人会在这些字符串指针上寻找提醒。我们被太多的常量和快捷键所破坏,但@“String”是一个常量,如果没有任何东西保留它就会被释放。