General-Block 56, 1024, 8, 244, 24 Memory Leaks using UIWebView loadRequest
Posted
技术标签:
【中文标题】General-Block 56, 1024, 8, 244, 24 Memory Leaks using UIWebView loadRequest【英文标题】: 【发布时间】:2011-04-21 04:53:19 【问题描述】:我遇到了内存泄漏,我无法通过泄漏、构建/分析或整体检查来解决如何修复。我有一个非常强烈的想法,这是由于我的 UIWebview 加载 javascript 中的 loadRequest 命令,但我不知道出了什么问题。
这是我的设置:
我有一个 tabbarcontroller,我用 4 个视图控制器以编程方式创建:分别是一个表视图、一个地图视图、另一个表视图和一个 web 视图。
第一个表视图显示静态数据。 mapview 显示注释,单击时会填充第 4 个选项卡的变量 webview,并切换到 webview 以显示本地存储的 html/javascript 文件,该文件是 3d 模型 第二个表格视图是地图视图中每个注释所代表的所有相同信息的列表,只是表格形式。它在填充变量、在 webview 中切换和显示 html/javascript 文件方面具有相同的功能 webview 显示加载的 html/javascript 文件,如果没有,它会显示 UIAlertView 从地图视图或列表中选择一个当我最终从 webview 执行 loadRequest() 时,最初一切正常。但是,当我开始在选项卡之间切换并查看不同的 3d 模型时(即转到地图视图单击注释以显示模型 x,观察它在 web 视图中加载,然后切换到列表并单击一行以显示模型y(或x)并观察它在webview中加载)我开始在ipad上接收内存泄漏,而不是模拟器。这些内存泄漏几乎总是:General-Block 56、1024、8、244 和 24,并且没有负责的帧、库或堆栈跟踪可跟进。
在 web 视图中,如果我注释掉 loadrequest 行或使用 request object = nil 执行 loadrequest,我没有内存泄漏,但是当我切换到使用指向本地文件的 url 对象时(我什至尝试指向它到 google.com,它有 javascript)它在内存泄漏中爆发。
我都尝试过:
[self.webView loadRequest:nil]; [self.webView loadHTMLString:@"" baseURL:nil]; [self.webView stopLoading];在我的 webViewController 的 viewWillDisappear 中,试图完全清除 webview 以供将来重用,但它似乎没有多大帮助。在执行 loadRequest 之前我也尝试过这样做,但我得到了相同的内存泄漏。
fyi,我正在运行最新的 xcode 4.0.2,而 ipad 有最新的更新,4.3.2 从我评论过的上一篇文章中,我没有收到 (general-block memory leak) 的回复,我认为问题与 webview 不知道如何在我切换视图时完全摆脱 javascript 的事实有关 我用一个没有 javascript 的简单 html 文件进行了测试,一般块内存泄漏已经消失。但是,我遇到了其他 cfnetwork / http 消息内存泄漏问题,但这是另一回事,目前我并不关心。以下是单击 mapView 上的其中一个注释时触发 webViewController 中的 loadModel 函数的示例代码:
- (void) mapCallOutPressed: (UIView *) sender
NSInteger selectedIndex = sender.tag;
MyLocation *selectedObject = [_mapView.annotations objectAtIndex:selectedIndex];
MyModel *model = selectedObject.model;
NSLog(@"Model selected from mapview = %@", model.description);
// Get reference to the webview from the tabBarController (viewController's index=3)
WebViewController *webViewController = [self.tabBarController.viewControllers objectAtIndex:3];
webViewController.model = model;
[webViewController loadModel];
// Switch tabs to the webView
self.tabBarController.selectedIndex = 3;
[self.tabBarController.selectedViewController viewDidAppear:YES];
下面是我的 webViewController.h & .m:
WebViewController.h:
WebViewController : UIViewController <UIWebViewDelegate>
UIWebView *webView;
NSString *templateRunFilePath;
MyModel *model;
NSString *templateRunTitle;
@property (nonatomic, retain) UIWebView *webView;
@property (assign) MyModel *model;
@property (nonatomic, copy) NSString *templateRunFilePath;
@property (nonatomic, copy) NSString *templateRunTitle;
-(void) loadModel;
WebViewController.m:
- (void) viewDidLoad
[super viewDidLoad];
NSLog(@"in webview did load");
self.webView = [[UIWebView alloc] initWithFrame:CGRectMake(0, 0, self.view.bounds.size.width, self.view.bounds.size.height)];
self.webView.delegate = self;
self.webView.autoresizingMask=(UIViewAutoresizingFlexibleHeight | UIViewAutoresizingFlexibleWidth);
self.webView.scalesPageToFit = YES;
[self.view addSubview:self.webView];
- (void) viewWillAppear:(BOOL)animated
if (self.model)
self.tabBarController.navigationItem.title = [NSString stringWithFormat: @"%@ - %@", self.tabBarController.navigationItem.title, self.model.description];
else
UIAlertView *msg = [[UIAlertView alloc] initWithTitle:@"No Model Selected"
message:@"Please select a model from the map or list tab to view."
delegate:nil
cancelButtonTitle:@"OK"
otherButtonTitles:nil];
[msg show];
[msg release];
- (void) loadModel
NSString *localURLPath = [NSString stringWithFormat:@"%@/%@/%@", self.templateRunFilePath, self.model.folderName, self.model.modelFileName];
NSURL *url = [NSURL fileURLWithPath:localURLPath];
NSURLRequest *requestObj = [NSURLRequest requestWithURL: url];
[self.webView loadRequest:requestObj];
- (void)webViewDidFinishLoad:(UIWebView *)webView
[[NSUserDefaults standardUserDefaults] setInteger:0 forKey:@"WebKitCacheModelPreferenceKey"];
-(void)viewWillDisappear:(BOOL)animated
NSLog(@"webview view will disappear");
[super viewWillDisappear:animated];
//[self.webView loadRequest:nil];
//[self.webView loadHTMLString:@"" baseURL:nil];
self.webView.delegate = nil;
- (void)dealloc
self.webView.delegate = nil;
[self.webView release];
[super dealloc];
如果您有任何建议或更正,我将不胜感激。我有
谢谢!
-迈克
【问题讨论】:
跟进:当使用仅加载非常大的静态图像(也存储在本地)的本地 html 文件时,我绝对没有内存泄漏,这与我最初关于收到 cfnetwork/http 错误的声明相反.从我上次观察到它已经停止了这些泄漏,我显然已经改变了一些东西。但是当我切换到加载指向我的包含 javascript(3d 模型)的 html 的对象时,泄漏又回来了。所以 uiwebview 肯定在努力完成对 javascript 的计算,或者正在拖拽的东西并没有完全停止 javascript 操作 只是为了让您了解我所面临的问题,对于我在 webView 中显示的每 ~10 个 html/javascript 3d 模型,它会产生大约 15-20 个泄漏,并且一旦存在一对,好吧,从那里开始它非常接近指数 为了尝试不同的东西,我在调用 loadModel 之前清除了 webview 对象:基本上,我将 webview 的委托归零,释放 webview,将其归零并从我的 viewDidLoad 执行代码。这似乎不会导致泄漏,但在收到内存警告和应用程序崩溃之前,我只能加载大约 2-3 个 webview。 似乎我现在唯一的泄漏是大量的通用块 56、一对 288 和一两个 1024。我无法告诉你到底发生了什么变化,但现在仅限于好像是这3种 【参考方案1】:Mike,我不确定你是故意还是错误地跟随?
- (void) loadModel
[self.webView loadHTMLString:@"" baseURL:nil]; // here you are loading... or you have tried with commenting it also?
NSString *localURLPath = [NSString stringWithFormat:@"%@/%@/%@", self.templateRunFilePath, self.model.folderName, self.model.modelFileName];
NSURL *url = [NSURL fileURLWithPath:localURLPath];
NSURLRequest *requestObj = [NSURLRequest requestWithURL: url];
[self.webView loadRequest:requestObj]; // again here you are also loading?
【讨论】:
请在加载...消息调用后查看 cmets。 感谢 Ravin 的快速响应,这实际上是我当时正在尝试的东西,但没有奏效,这是故意的。[self.webView loadHTMLString:@"" baseURL:nil]
已被删除以上是关于General-Block 56, 1024, 8, 244, 24 Memory Leaks using UIWebView loadRequest的主要内容,如果未能解决你的问题,请参考以下文章