使用代理,NSURLConnection泄漏https URL

时间:2010-06-25 00:48:29

标签: objective-c cocoa

仪器报告泄漏,只需使用NSURLConnection:

#import <Foundation/Foundation.h>
int main (int argc, char ** argv)
{
    NSAutoreleasePool *pool = [NSAutoreleasePool new];
    NSURLRequest *theRequest = [NSURLRequest
        requestWithURL:[NSURL URLWithString:@"https://gmail.com/"]
        cachePolicy:NSURLRequestReloadIgnoringLocalCacheData
        timeoutInterval:60.0];
    [NSURLConnection connectionWithRequest:theRequest delegate:nil];
    [[NSRunLoop currentRunLoop] runUntilDate:[NSDate dateWithTimeIntervalSinceNow:5]];
    [pool drain];
    [NSThread sleepForTimeInterval:10]; // wait for Instruments to check
}

泄漏堆栈跟踪:

   0 CoreFoundation __CFBasicHashRehash
   1 CoreFoundation CFDictionaryCreate
   2 CFNetwork _getConnectionInfoForProxy
   3 CFNetwork HTTPProtocol::createStream()
   4 CFNetwork HTTPProtocol::createAndOpenStream()
   5 CFNetwork executionContextPerform(void*)
   6 CoreFoundation __CFRunLoopDoSources0
   7 CoreFoundation __CFRunLoopRun
   8 CoreFoundation CFRunLoopRunSpecific
   9 CoreFoundation CFRunLoopRunInMode
  10 Foundation +[NSURLConnection(NSURLConnectionReallyInternal) _resourceLoadLoop:]
  11 Foundation -[NSThread main]
  12 Foundation __NSThread__main__
  13 libSystem.B.dylib _pthread_start
  14 libSystem.B.dylib thread_start

如果网址只是普通的http并且它没有重定向到https网站,则不会泄漏。

如何修复泄漏?

我正在使用Snow Leopard,我有http和https的代理。

1 个答案:

答案 0 :(得分:0)

我认为你问的是错误的问题。这是你应该问的问题:

  1. 我是否遵循内存管理规则?
  2. 如果我,我需要担心吗?
  3. 在您的情况下,答案分别为(是)和“否”。您很可能在Cocoa框架中发现了内存泄漏。但是在这种情况下,我认为你没有。你看,当前线程的NSRunLoop保留NSURLConnection,所以你可能没有给运行循环足够的时间来释放连接或其他东西。

    重点是,没有做错任何事,所以不要恐慌。