【发布时间】:2011-02-03 05:13:44
【问题描述】:
我正在对我当前的项目进行泄漏测试,但我很难过。我一直在疯狂地浏览并尝试了除了鸡肉牺牲之外的所有东西。我刚刚从头开始创建了一个小型玩具项目应用程序,我可以在其中复制泄漏。所以要么UIWebView 有泄漏,要么我正在做一些非常愚蠢的事情。
本质上,它归结为对 UIWebView 对象的 loadRequest: 调用,给定一个从引用文件 URL 的 NSURL 构建的 URLRequest,用于应用程序包中的文件,该文件位于Xcode 通过引用包含的文件夹。唷。
泄漏是间歇性的,但仍有约 75% 的时间发生(在大约 20 次测试中发生了大约 15 次)。它仅发生在设备上——这不会在模拟器中泄漏。我正在使用 iPhone OS 3.1.3 的原始(第一代)iPod Touch 上针对 iPhone OS 3.1.2 和 3.1.3 进行测试。
要重现,只需从头开始创建一个项目。将UIWebView 添加到RootViewController 的.xib,通过IBOutlet 连接它。在 Finder 中,在项目文件夹中创建一个名为“html”的文件夹。在该文件夹中,创建一个名为“dummy.html”的文件,其中包含“Test”一词。 (not 必须是有效的 HTML。)然后通过选择“为任何添加的文件夹创建文件夹引用”将 html 文件夹添加到 Xcode 中的项目中
将以下内容添加到viewDidLoad
NSString* resourcePath = [[NSBundle mainBundle] resourcePath];
NSString* filePath = [[resourcePath stringByAppendingPathComponent:@"html"] stringByAppendingPathComponent:@"dummy.html"];
NSURL* url = [[NSURL alloc] initFileURLWithPath:filePath];
NSURLRequest* request = [NSURLRequest requestWithURL:url]; // <-- this creates the leak!
[browserView loadRequest:request];
[url release];
我已经尝试了所有方法,从为 UIWebView 设置委托和实现 UIWebViewDelegate,到不在 IB 中设置委托,再到不在 IB 中设置委托,以及将 Web 视图的 delegate 属性显式设置为零,使用alloc/init 而不是自动释放NSURLRequests(和/或NSURLs)...
我尝试了a similar question 的答案(将共享 URL 缓存设置为空),但没有帮助。
谁能帮忙?
【问题讨论】:
-
提交到 Apple Radar 错误 ID #7892070
-
Apple 表示 iPhone OS 4.0 测试版中不存在泄漏。
标签: iphone cocoa-touch memory-leaks uiwebview