在UIWebView中调用loadRequest时,GeneralBlock-56内存泄漏

时间:2011-03-29 09:01:31

标签: iphone ipad memory-leaks uiwebview instruments

我正在开发一个IPad应用程序,并使用XCode 4中的Instruments进行分析。 我正在分析实际设备本身。已安装iOS 4.3。

乐器告诉我,我有一些内存泄漏,泄漏的对象主要是GeneralBlock-56个和一些GeneralBlock-1024 / GeneralBlock-8192个。 有趣的是,只有当我在我的应用程序中嵌入的UIWebView中加载URL时,才会报告这些泄漏。如果我注释掉loadRequest电话,这些泄漏就会消失。这种行为始终可以重现。

loadRequest()调用如下所示:

[webPage loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://slashdot.org"]]];

顺便说一下,我没有为这个UIWebView指定任何委托。 泄漏不显示任何负责任的库/负责框架,并且最右边的框架中没有扩展详细信息。

我试图摆弄NSURLCache设置,如下所示:

NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];

这减少了一些GeneralBlock内存泄漏,但仍有一些仍然存在。 任何关于这种行为的见解都非常受欢迎......谢谢!

4 个答案:

答案 0 :(得分:2)

这是我向Apple Developer Bug Reporting工具提交的错误报告。在我的案例中,这似乎是造成内存泄漏的重大问题之一。

摘要:将格式不正确的NSURL传递给NSData dataWithContentsOfURL:导致createCanonicalURL()方法中的内存泄漏。

重现步骤

在任何简单项目中,将以下行放在控制器中,例如,在loadView:或viewDidLoad:methods中。:

NSURL* u = [NSURL URLWithString:@"http:/portalqa01:70/Images/Leading%20out%20of%20a%20Downturn%20-%20Article%20Illustration%20-%20Large_tcm137-38905.gif"];
    NSData* data = [NSData dataWithContentsOfURL:u options:0 error:nil];

请注意,网址在“http:”之后只有一个斜杠,而不是惯用的两个斜杠。

预期结果:不应有任何内存泄漏。

实际结果:仪器显示内存泄漏。

回归: 这仅适用于某些格式错误的URL,上面的URL是一个特定示例。像“http:/blah/blah.png”这样的网址不会导致泄密。 用于重现这一点的环境是:

  • iPad 4.3模拟器
  • iPad 2 with iOS 4.3.1

注意: 堆栈跟踪如下:

STACK TRACE START

   0 CFNetwork createCanonicalURL
   1 CFNetwork HTTPProtocol::_createMutableCanonicalRequest(__CFAllocator const*, _CFURLRequest const*, void const*)
   2 CFNetwork HTTPProtocol::_createCanonicalRequest(__CFAllocator const*, _CFURLRequest const*, void const*)
   3 CFNetwork HTTPProtocol::copyCanonicalRequest()
   4 CFNetwork URLConnectionLoader::copyProtocolCanonicalRequest()
   5 CFNetwork URLConnectionClient::getRequestForTransmission(unsigned char, _CFURLResponse*, _CFURLRequest const*, __CFError**)
   6 CFNetwork URLConnectionClient::_clientWillSendRequest(_CFURLRequest const*, _CFURLResponse*, URLConnectionClient::ClientConnectionEventQueue*)
   7 CFNetwork URLConnectionClient::ClientConnectionEventQueue::processAllEventsAndConsumePayload(XConnectionEventInfo<XClientEvent, XClientEventParams>*, long)
   8 CFNetwork URLConnectionClient::processEvents()
   9 CFNetwork MultiplexerSource::perform()
  10 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__
  11 CoreFoundation __CFRunLoopDoSources0
  12 CoreFoundation __CFRunLoopRun
  13 CoreFoundation CFRunLoopRunSpecific
  14 CoreFoundation CFRunLoopRunInMode
  15 CFNetwork CFURLConnectionSendSynchronousRequest
  16 Foundation +[NSURLConnection sendSynchronousRequest:returningResponse:error:]
  17 Foundation -[NSData(NSData) initWithContentsOfURL:options:error:]
  18 Foundation +[NSData(NSData) dataWithContentsOfURL:options:error:]
  19 MemLeakTester -[MemLeakTesterViewController viewDidLoad] /Users/admin/IPadSpikes/MemLeakTester/MemLeakTester/MemLeakTester/MemLeakTesterViewController.m:36
  20 UIKit -[UIViewController view]
  21 UIKit -[UIWindow addRootViewControllerViewIfPossible]
  22 MemLeakTester -[MemLeakTesterAppDelegate application:didFinishLaunchingWithOptions:] /Users/admin/IPadSpikes/MemLeakTester/MemLeakTester/MemLeakTester/MemLeakTesterAppDelegate.m:27
  23 UIKit -[UIApplication _callInitializationDelegatesForURL:payload:suspended:]
  24 UIKit -[UIApplication _runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
  25 UIKit -[UIApplication handleEvent:withNewEvent:]
  26 UIKit -[UIApplication sendEvent:]
  27 UIKit _UIApplicationHandleEvent
  28 GraphicsServices PurpleEventCallback
  29 CoreFoundation __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE1_PERFORM_FUNCTION__
  30 CoreFoundation __CFRunLoopDoSource1
  31 CoreFoundation __CFRunLoopRun
  32 CoreFoundation CFRunLoopRunSpecific
  33 CoreFoundation CFRunLoopRunInMode
  34 UIKit -[UIApplication _run]
  35 UIKit UIApplicationMain
  36 MemLeakTester main /Users/admin/IPadSpikes/MemLeakTester/MemLeakTester/MemLeakTester/main.m:14
  37 MemLeakTester start

STACK TRACE END

答案 1 :(得分:1)

我遇到了同样的问题。我仍然试图验证这一点,但我最初的观察是它只发生在提供javascript服务的网站上。你有没有观察过这种模式?

答案 2 :(得分:1)

尝试添加

[webView loadHTMLString: @"" baseURL: nil];

在发布webview之前。对于4.2.1中有关在UIWebView中显示PDF的泄漏,这解决了我的大部分泄漏问题。

答案 3 :(得分:1)

嗯,我在UI,iPad,iPad,iPhone上遇到了一大堆漏洞(General-Block56等)。最后,以下内容有所帮助:拒绝Nib文件和方法'viewDidLoad'。而不是这个,我已经以编程方式在'loadView'中创建了webview:

- (void)loadView 
{ 
    self.activityView = [[[UIActivityIndicatorView alloc]    initWithActivityIndicatorStyle:UIActivityIndicatorViewStyleGray] autorelease];
    self.webView = [[UIWebView alloc] initWithFrame:[[UIScreen mainScreen] applicationFrame]];
    [self.webView addSubview: self.activityView];
    self.webView.scalesPageToFit = YES;
    self.view = self.webView;
    [self addGestures];
} 

- (void)viewWillAppear:(BOOL)animated 
{ 
      self.webView.delegate = self;
      [self.webView loadRequest:[self urlRequest]];
      [super viewWillAppear:animated];

}

最后,在开始加载第一页后,只剩下一个小泄漏(16个字节)。所有其他页面加载没有任何泄漏。希望这可以帮助。