【问题标题】:GeneralBlock-56 memory leak when calling loadRequest in UIWebView在 UIWebView 中调用 loadRequest 时出现 GeneralBlock-56 内存泄漏
【发布时间】:2011-07-25 02:47:05
【问题描述】:

我正在开发一个 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 内存泄漏,但仍然存在一些。 非常欢迎对此行为的任何见解...谢谢!

【问题讨论】:

    标签: iphone ipad memory-leaks uiwebview instruments


    【解决方案1】:

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

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

    复制步骤

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

    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];
    

    请注意,URL 在“http:”之后只有一个斜杠,而不是通常的两个。

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

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

    回归: 这只发生在一些格式错误的 URL 上,上面的 URL 是一个具体的例子。像“http:/blah/blah.png”这样的 URL 不会导致泄漏。 用于重现这一点的环境是:

    • iPad 4.3 模拟器
    • 装有 iOS 4.3.1 的 iPad 2

    注意事项: 堆栈跟踪如下:

    堆栈跟踪开始

       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
    

    堆栈跟踪结束

    【讨论】:

    • 如果你从苹果那里得到任何消息或更新,请及时更新,因为我也面临同样的问题。提前致谢。
    【解决方案2】:

    好吧,我在 UIWebView 上遇到了同样的问题 - iPad、iPad2、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 个字节)。所有其他页面确实加载而没有任何泄漏。希望这可以帮助。

    【讨论】:

      【解决方案3】:

      尝试添加

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

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

      【讨论】:

      • 感谢这有助于修复我的一些漏洞,我仍然收到一些
      【解决方案4】:

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

      【讨论】:

      • 我刚刚在 iOS 4.3 上遇到了同样的问题。我的观察与清醒者的相同。我认为 WebKit 没有正确销毁 js 对象。
      • 我也有同样的问题。但我不知道它只用 javascript
      猜你喜欢
      • 1970-01-01
      • 2015-04-08
      • 1970-01-01
      • 2013-11-13
      • 1970-01-01
      • 2012-02-13
      • 1970-01-01
      • 2011-09-19
      相关资源
      最近更新 更多