代码之家  ›  专栏  ›  技术社区  ›  Mark Struzinski

在这个objective-c nsxmlparser代码中找不到漏洞?

  •  0
  • Mark Struzinski  · 技术社区  · 16 年前

    我刚开始使用iPhone编程,现在正在运行我的应用程序来对付仪器中的泄漏工具。该工具正在查找一些泄漏,所有这些泄漏似乎都指向使用nsxmlparser的类中的一行代码:

    - (BOOL)parse{  
        NSURL *url = [[NSURL alloc] initWithString:@"[url here]"];
        NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
        [parser setDelegate:self];
        NSLog(@"NSXMLParser initialized");
    
        [parser parse];
    
        [url release];
        [parser release];
        return YES;
    }
    

    该工具指向创建解析器的行,认为该行存在泄漏:

    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    

    有人能给我指一个正确的方向吗?我已经在代码中检查了一个小时的引用计数,现在没有任何运气。

    更新:

    好的,根据2个答案的建议,我在创建nsurl之前添加了这些行:

    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    

    我在释放解析器之前添加了这一行:

    [parser setDelegate:nil];
    

    每增加一个就减少了泄漏的数量,现在我降到了2个。一是指向CFN网络,一是作为责任图书馆的基础。检查两者的调用堆栈根本不显示我的任何代码。

    这里还有什么我可能做错的地方吗?

    4 回复  |  直到 15 年前
        1
  •  1
  •   Community Mohan Dere    9 年前

    我在另一条线索上发现了:

    [[NSURLCache sharedURLCache] setMemoryCapacity:0];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    NSXMLParser *parser = [[NSXMLParser alloc] initWithContentsOfURL:URL];
    

    (来源: another stackoverflow topic )

    但我还没有测试这个解决方案。

        2
  •  1
  •   Dimitris    16 年前

    您是否尝试将分析器的委托设置为 nil 在释放它之前?有些班级倾向于保留他们的代表…

    编辑:

    我没有真正看到解析器是一个 NSXMLParser 实例。在阅读文档时,我可以看到他们说:“ 不保留。 “。不过我还是会试试的。

        3
  •  1
  •   bbum    16 年前

    如果这真的是您的代码的全部,那么它听起来确实像是底层框架中存在漏洞。压缩示例程序并 file a bug 请。

    但是,它并不是整个代码——如果委托方法保留了任何内容,并且没有与发布进行平衡,那么它将导致泄漏。混淆可能是因为泄漏仪器显示对象的分配点 实际的 泄漏可能是由随后的 retain .

    特别是,使用Object alloc工具和泄漏检测,您可以深入查看到底是谁保留和释放了任何给定的对象。这可能会使情况有所改观。

        4
  •  0
  •   Primc    15 年前

    我也遇到了同样的问题,我怀疑泄漏是在底层框架中。

    我的代码从:

    NSXMLParser * parser = [[NSXMLParser alloc] initWithContentsOfURL:fileName];
    

    对此:

    NSData * fileData = [[NSData alloc] initWithContentsOfURL:fileName];
    NSXMLParser * parser = [[NSXMLParser alloc] initWithData:fileData];
    [parser setDelegate:self];
    [parser parse];
    [parser release]; 
    [fileData release];
    

    泄漏消失了。