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

标签 iphone ipad memory-leaks uiwebview instruments

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

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

loadRequest() 调用如下所示:

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

顺便说一句,我没有为此 UIWebView 指定任何委托(delegate)。 泄漏没有显示任何负责任的库/负责任的框架,并且最右边的框架中没有扩展细节。

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

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

这减少了一些 GeneralBlock 内存泄漏,但仍有一些泄漏。 非常欢迎对此行为的任何见解...谢谢!

最佳答案

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

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

重现步骤

在任何简单的项目中,将以下行放入 Controller 中,例如,在 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:”后面只有一个斜杠,而不是通常的两个斜杠。

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

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

回归: 这只发生在某些格式错误的 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
<小时/>

堆栈跟踪结束

关于iphone - GeneralBlock-56 在 UIWebView 中调用 loadRequest 时内存泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5470121/

相关文章:

ios - 如何通过 SKEffectNode 在 Sprite 周围创建光晕

iphone - JPEG编码器速度超慢,如何优化?

objective-c - 如何在 iOS 上创建类似 Excel 的网格?

c++ - 使用 STL 编写内存泄漏安全代码应该避免什么?

java - 如何判断堆转储中字符串与 char[] 的比率是否表明存在问题?

iphone - 如何呈现 tabview Controller ?

javascript - 在 iPad 上从 "src"事件更改图像元素的 "touchend"?

html - 如何在 css 中区分 ipad 和 ipad pro 的媒体屏幕

iphone - IOS:使用图案图像作为背景 - 内存泄漏

ios - Objective-C如何生成具有n个值的钟形曲线数组?