GeneralBlock-56 在 UIWebView 中调用 loadRequest 时内存泄漏
我正在开发一个 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 指定任何委托。 泄漏没有显示任何负责任的库/负责任的框架,并且最右边的框架中没有扩展细节。
我尝试摆弄 NSURLCache 设置,如下所示:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
这减少了一些 GeneralBlock 内存泄漏,但仍有一些泄漏。 非常欢迎对此行为的任何见解...谢谢!
I'm working on an IPad app and have been profiling it using Instruments in XCode 4.
I'm profiling on the actual device itself. iOS 4.3 is installed.
Instruments tells me I have some memory leaks, the leaked objects being mainly GeneralBlock-56
ones and some GeneralBlock-1024
/GeneralBlock-8192
ones.
The interesting thing is that these leaks are reported only when I load up a URL in a UIWebView embedded in my app. If I comment out the loadRequest
call, these leaks go away. This behavior is consistently reproducible.
The loadRequest() calls looks like this:
[webPage loadRequest:[NSURLRequest requestWithURL:[NSURL URLWithString:@"http://slashdot.org"]]];
I'm not specifying any delegates for this UIWebView, by the way.
The leaks do not show any Responsible Library/Responsible Frame and there is no Extended Detail in the rightmost frame.
I have tried to fiddle around with the NSURLCache settings, like so:
NSURLCache *sharedCache = [[NSURLCache alloc] initWithMemoryCapacity:0 diskCapacity:0 diskPath:nil];
[NSURLCache setSharedURLCache:sharedCache];
[sharedCache release];
This reduces a few of the GeneralBlock memory leaks, but some still remain.
Any insights on this behavior are very welcome...thanks!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
这是我使用 Apple 开发者错误报告工具提交的错误报告。在我的案例中,这似乎是导致内存泄漏的大问题之一。
摘要:将格式不正确的 NSURL 传递给 NSData dataWithContentsOfURL:会导致 createCanonicalURL() 方法中的内存泄漏。
重现步骤
在任何简单的项目中,将以下行放入控制器中,例如例如,在 loadView: 或 viewDidLoad: 方法中:
请注意,URL 在“http:”后面只有一个斜杠,而不是通常的两个斜杠。
预期结果:不应有任何内存泄漏。
实际结果:仪器显示内存泄漏。
回归:
这只发生在某些格式错误的 URL 上,上面的 URL 是一个具体示例。像“http://blah/blah.png”这样的 URL 不会导致泄漏。
用于重现此情况的环境是:
注意:
堆栈跟踪如下:
STACK TRACE START
STACK TRACE END
This is a bug report I filed with the Apple Developer Bug Reporting tool. This seemed to be one of the big issues causing the memory leak in my case.
Summary: Passing incorrectly formatted NSURL to NSData dataWithContentsOfURL: causes memory leak in createCanonicalURL() method.
Steps to Reproduce
In any simple project, put the following lines in your controller, for example, in loadView: or viewDidLoad: methods.:
Note that the URL has only a single slash after "http:" instead of the customary two.
Expected Results: There shouldn't be any memory leak.
Actual Results: Instruments shows a memory leak.
Regression:
This only occurs for some malformed URLs, the URL above is a specific example. A URL like "http:/blah/blah.png" will not cause a leak.
The environments used to reproduce this were:
Notes:
The stack trace is as below:
STACK TRACE START
STACK TRACE END
我遇到了同样的问题。我仍在尝试验证这一点,但我最初的观察是,它只发生在提供 javascript 的网站上。你观察过这种模式吗?
I am experiencing the same issue. I am still trying to verify this, but my initial observation is that it only occurs with sites that are serving javascript. Have you observed this pattern?
尝试
在释放 webview 之前添加。对于 4.2.1 中与在 UIWebView 中显示 PDF 相关的泄漏,这为我解决了大部分泄漏问题。
Try adding
right before you release the webview. For a leak in 4.2.1 relating to displaying a PDF in a UIWebView this solves most of the leak problems for me.
好吧,我在 UIWebView 上也遇到了同样的问题 - iPad、iPad2、iPhone 上有一大堆泄漏(General-Block56 等)。最后,以下内容有所帮助:拒绝 Nib 文件和“viewDidLoad”方法。相反,我以编程方式在“loadView”中创建了 webview:
最后,在开始加载第一页后,只剩下一个小泄漏(16 字节)。所有其他页面均已加载,没有任何泄漏。希望这有帮助。
Well, I had the same issue with UIWebView - a whole bunch of leaks (General-Block56 etc) on iPad, iPad2, iPhone. Finally the following helped: reject the Nib-file and the method 'viewDidLoad'. Instead of this I've created the webview in 'loadView' programmatically:
At the end there's only one small leak remaining (16 bytes) right after start loading the very first page. All other pages did load without any leak. Hope this helps.