Iphone stringWithContentsOfURL内存泄漏
如果我告诉你fetchHTML是在一个单独的线程中被调用的,这会更清楚吗?我还在调试控制台中看到一些消息,例如: _NSAutoreleaseNoPool():NSCFDictionary类的对象0xd92860在没有池的情况下自动释放-只是泄漏 _NSAutoreleaseNoPool():NSCFString类的对象0xd92800在没有池的情况下自动释放-只是泄漏 我不熟悉iPhone应用程序开发,Objective-C,但对编程或C/C++并不陌生。我正在使用泄漏性能工具,它显示了许多泄漏。这是一个10.5 kb的泄漏,发生在管线上:Iphone stringWithContentsOfURL内存泄漏,iphone,objective-c,memory-leaks,autorelease,Iphone,Objective C,Memory Leaks,Autorelease,如果我告诉你fetchHTML是在一个单独的线程中被调用的,这会更清楚吗?我还在调试控制台中看到一些消息,例如: _NSAutoreleaseNoPool():NSCFDictionary类的对象0xd92860在没有池的情况下自动释放-只是泄漏 _NSAutoreleaseNoPool():NSCFString类的对象0xd92800在没有池的情况下自动释放-只是泄漏 我不熟悉iPhone应用程序开发,Objective-C,但对编程或C/C++并不陌生。我正在使用泄漏性能工具,它显示了许多泄
NSString * xml = [NSString stringWithContentsOfURL:urlobj];
下面的堆栈跟踪是:
stringWithContentsOfURL
initWithContentsOfURL
initWithDataOfEncoding
...
有人知道为什么会这样吗。我的印象是,我在这里得到了一个自动释放对象,我可以将其返回给调用方,而无需调用retain。我没有使用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;
}
是的;那不应该泄漏 URL子系统正在缓存URL的内容,并且这样做的方式使指针不再对分析可见,这可能是误报
如果可以,请在雪豹上重试测试。雪豹上的泄漏检测速度更快、更准确。我完全同意您的看法,这不会导致泄漏。我已经用Cocoa/Objective-C编写代码两年了,看起来应该可以用了 话虽如此,我注意到苹果的文档表明
stringWithContentsOfURL:
方法正在使用中。也许它的工作原理如下:
NSString * xml = [[NSString alloc]
initWithContentsOfURL:urlobj
encoding:NSASCIIStringEncoding
error:nil];
return [xml autorelease];
正如错误消息所说,没有自动释放池供字符串进入,这会造成泄漏。NSAutoReleasePool以每个线程为基础存在。Cocoa在主线程的主事件循环中创建一个,但这是它为您创建的唯一一个。如果您在主线程之外的其他地方,并且要处理自动释放对象,那么还需要为该线程创建一个自动释放池
有关自动释放池堆栈如何工作的更多信息,请查看。我绝对可以尝试。我告诉过你,fetchHTML是在一个单独的线程中被调用的。我需要创建一个新的自动释放池吗?在调试控制台中,我看到如下消息“类***的对象****在没有池的情况下自动释放-只是泄漏我恐怕不是自动释放池线程使用方面的专家。不过,这听起来确实可能是个问题。为什么不将这些信息添加到问题中呢?谢谢,我在线程函数周围添加了一个autoreleasepool包装器,但是我得到了一个objc_msgSend错误。代码如下:NSAutoreleasePool*pool=[[NSAutoreleasePool alloc]init];[dataArray replaceObjectAtIndex:2 with Object:“现在做什么”];[池释放];知道这里发生了什么吗?试试[dataArray replaceObjectAtIndex:2 withObject:@“now what”];请注意@符号。实际上,replaceObjectAtIndex。。。在自动释放池出现之前,该行也不可能工作。
如果我告诉您fetchHTML是在一个单独的线程中调用的,那么它会更清楚吗?
是的。您确实按照文档的要求为线程创建了一个自动释放池,对吗?最好是在生成的线程的方法/函数入口点中做的第一件事情之一(如果不是的话)。