1

如果我告诉 fetchHTML 在单独的线程中被调用,它会更清楚吗?我还在调试控制台中看到了几条消息,例如:

_NSAutoreleaseNoPool():NSCFDictionary 类的对象 0xd92860 自动释放,没有适当的池 - 只是泄漏

_NSAutoreleaseNoPool():NSCFString 类的对象 0xd92800 自动释放,没有适当的池 - 只是泄漏

我是 iPhone 应用程序开发、Objective-C 的新手,但对编程或 C/C++ 并不陌生。我正在使用泄漏性能工具,它显示了许多泄漏。这是一个 10.5 kb 的泄漏,它发生在以下行:

NSString * xml = [NSString stringWithContentsOfURL:urlobj];

下面的堆栈跟踪是:

stringWithContentsOfURL
initWithContentsOfURL
initWithDataOfEncoding
...

有谁知道为什么这一定会发生。我的印象是我在这里得到了一个自动释放对象,我可以在不调用保留的情况下将它返回给调用者。我没有使用 xml 对象存储在实例变量中,只是为了处理。

这是功能代码:

- (NSString *) fetchHTML: (NSString* ) url{
    @try
    {
        NSURL* urlobj = [NSURL URLWithString:url];
        NSString * xml = [NSString stringWithContentsOfURL:urlobj];
        return xml;
    }
    @catch( NSException *ex){
        NSLog(@"Error fetchingHTML");
        return nil;
    }
    return nil;
}
4

3 回答 3

1

正如错误消息所说,没有可供字符串进入的自动释放池,这会造成泄漏。NSAutoreleasePools 存在于每个线程的基础上。Cocoa 在主线程的主事件循环中创建一个,但这是它为您创建的唯一一个。如果您在主线程之外的某个地方并且要处理自动释放的对象,则还需要为该线程创建一个自动释放池。

您可以查看NSAutoreleasePool 文档以获取有关自动释放池堆栈如何工作的更多信息。

于 2009-08-30T21:01:07.760 回答
1

是的; 那不应该泄漏。

这可能是误报,因为 URL 子系统正在缓存 URL 的内容,并且这样做的方式是指针不再对泄漏分析可见。

如果可以,请在 Snow Leopard 上重试测试。Snow Leopard 上的泄漏检测明显更快、更准确。

于 2009-08-30T19:17:10.107 回答
1

我完全同意你的看法,这不应该导致泄漏。我已经在 Cocoa/Objective-C 中编码 2 年了,看起来它应该可以工作。

话虽如此,我注意到 Apple 的文档表明该stringWithContentsOfURL:方法已被弃用。也许它会按如下方式工作:

NSString * xml = [[NSString alloc]
                  initWithContentsOfURL:urlobj
                               encoding:NSASCIIStringEncoding
                                  error:nil];
return [xml autorelease];
于 2009-08-30T19:20:36.433 回答