Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/41.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone stringWithContentsOfURL内存泄漏_Iphone_Objective C_Memory Leaks_Autorelease - Fatal编程技术网

Iphone stringWithContentsOfURL内存泄漏

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++并不陌生。我正在使用泄漏性能工具,它显示了许多泄

如果我告诉你fetchHTML是在一个单独的线程中被调用的,这会更清楚吗?我还在调试控制台中看到一些消息,例如:

_NSAutoreleaseNoPool():NSCFDictionary类的对象0xd92860在没有池的情况下自动释放-只是泄漏

_NSAutoreleaseNoPool():NSCFString类的对象0xd92800在没有池的情况下自动释放-只是泄漏

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

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是在一个单独的线程中调用的,那么它会更清楚吗?
是的。您确实按照文档的要求为线程创建了一个自动释放池,对吗?最好是在生成的线程的方法/函数入口点中做的第一件事情之一(如果不是的话)。