Iphone 在UIWebView中调用loadRequest时发生GeneralBlock-56内存泄漏

Iphone 在UIWebView中调用loadRequest时发生GeneralBlock-56内存泄漏,iphone,ipad,memory-leaks,uiwebview,instruments,Iphone,Ipad,Memory Leaks,Uiwebview,Instruments,我正在开发一款IPad应用程序,并一直在使用XCode 4中的仪器对其进行评测。 我正在对实际设备本身进行分析。已安装iOS 4.3 Instruments告诉我有一些内存泄漏,泄漏的对象主要是GeneralBlock-56对象和一些GeneralBlock-1024/GeneralBlock-8192对象。 有趣的是,只有当我在嵌入我的应用程序的UIWebView中加载URL时,才会报告这些泄漏。如果我注释掉loadRequest调用,这些泄漏就会消失。这种行为始终是可复制的 loadRequ

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

Instruments告诉我有一些内存泄漏,泄漏的对象主要是
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];
这减少了一些通用块内存泄漏,但有些仍然存在。
欢迎对这种行为有任何见解…谢谢

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

尝试添加

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

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

好吧,我在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字节)。所有其他页面都加载了,没有任何泄漏。希望这有帮助

这是我用苹果开发者bug报告工具提交的bug报告。在我的案例中,这似乎是导致内存泄漏的一个大问题

摘要:将格式不正确的NSURL传递给NSData DATA,其内容为URL:会导致CreateCononicalURL()方法内存泄漏。

复制步骤

在任何简单项目中,在控制器中放置以下行,例如,在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不会导致泄漏。 用于重现这种情况的环境是:

  • iPad4.3模拟器
  • 带iOS 4.3.1的iPad2
注: 堆栈跟踪如下所示:

堆栈跟踪开始
0 CFNetwork CreateCononicalURL
1 CFNetwork HTTPProtocol::_createMutableCanonicalRequest(uu CFAllocator const*,u CFURLRequest const*,void const*)
2 CFNetwork HTTPProtocol::_createCanonicalRequest(uu CFAllocator const*,_cfurlRequestconst*,void const*)
3 CFNetwork HTTPProtocol::copyCanonicalRequest()
4 CFNetwork URLConnectionLoader::copyProtocolCanonicalRequest()
5 CFNetwork URLConnectionClient::getRequestForTransmission(无符号字符,\u CFURLResponse*,\u CFURLRequest const*,\u cfurerror**)
6 CFNetwork URLConnectionClient::_clientWillSendRequest(_cfurlRequestconst*,_CFURLResponse*,URLConnectionClient::ClientConnectionEventQueue*)
7 CFNetwork URLConnectionClient::ClientConnectionEventQueue::processAllEventsAndConsumePayload(XConnectionEventInfo*,长)
8 CFNetwork URLConnectionClient::processEvents()
9 CFNetwork MultiplesterSource::perform()
10 CoreFoundation\uuu CFRUNLOOP\u正在调用\u OUT\u以执行\u SOURCE0\u函数__
11 CoreFoundation\uu CFRunLoopDoSources0
12核心基金会
13 CoreFoundation CFRunLoopRunSpecific
14 CoreFoundation CFRunLoopRunInMode
15 CFN网络CFURLConnectionSendSynchronousRequest
16基金会+ [ nSurLink SeNealSimulink请求:回复响应:错误:]
17基金会[NStase](NStase:NITDATA)和内容:URL:选项:错误:
18基金会+ [ NSATATS(NSATATE)数据和内容:URL:选项:错误:]
19 MemLeakTester-[MemLeakTesterViewDidLoad]/Users/admin/IPadSpikes/MemLeakTester/MemLeakTester/MemLeakTester/MemLeakTester/MemLeakTesterViewDidController.m:36
20 UIKit-[UIViewController视图]
21 UIKit-[UIWindow AddRootViewControllerServiceWifPossible]
22 MemLeakTester-[MemLeakTesterApdelegate应用程序:使用选项完成启动:][Users/admin/IPadSpikes/MemLeakTester/MemLeakTester/MemLeakTesterApdelegate.m:27
23 UIKit-[UIApplication\u CallInitializationDelegatesForRL:有效负载:挂起:]
24 UIKit-[UIApplication\u runWithURL:payload:launchOrientation:statusBarStyle:statusBarHidden:]
25 UIKit-[UIApplication handleEvent:withNewEvent:]
26 UIKit-[UIApplication sendEvent:]
27 UIKit_UIApplicationHandleEvent
28 Graphics服务PurpleEventCallback
29 CoreFoundation\uuu CFRUNLOOP\u正在调用\u OUT\u以执行\u SOURCE1\u函数__
30 CoreFoundation\uu CFRunLoopDoSource1
31核心基金会
32 CoreFoundation CFRunLoopRunSpecific
33 CoreFoundation CFRunLoopRunInMode
34 UIKit-[UIApplication\u run]
35 UIKit UIApplicationMain
36 MemLeakTester main/Users/admin/IPadSpikes/MemLeakTester/MemLeakTester/MemLeakTester/main.m:14
37膜泄漏测试仪启动


堆栈跟踪结束

我刚刚在iOS 4.3上遇到了同样的问题。我的观察结果和露西比恩的一样。我认为WebKit没有正确地销毁js对象。我也有同样的问题。但我不知道这只是Javascript,谢谢这帮助修复了我的一些漏洞,如果你从苹果得到任何消息或更新,我仍然会收到一些关于这方面的更新,因为我也面临着同样的问题。提前谢谢。
   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