Iphone 使用UIWebView loadRequest的常规块56、1024、8、244、24内存泄漏

Iphone 使用UIWebView loadRequest的常规块56、1024、8、244、24内存泄漏,iphone,ipad,memory-leaks,uiwebview,mkmapview,Iphone,Ipad,Memory Leaks,Uiwebview,Mkmapview,我遇到了内存泄漏,我无法通过泄漏、构建/分析或全面检查找出修复方法。我有一个非常强烈的想法,那就是这是由于我的UIWebview加载javascript的loadRequest命令造成的,但我不知道是什么错了 以下是我的设置: 我有一个tabbarcontroller,我通过编程创建了4个视图控制器:一个表视图、一个mapview、另一个表视图和一个webview 第一个表视图显示静态数据 mapview显示的注释在单击时填充第四个选项卡webview的变量,并切换到webview以显示本地存

我遇到了内存泄漏,我无法通过泄漏、构建/分析或全面检查找出修复方法。我有一个非常强烈的想法,那就是这是由于我的UIWebview加载javascript的loadRequest命令造成的,但我不知道是什么错了

以下是我的设置:

我有一个tabbarcontroller,我通过编程创建了4个视图控制器:一个表视图、一个mapview、另一个表视图和一个webview

  • 第一个表视图显示静态数据
  • mapview显示的注释在单击时填充第四个选项卡webview的变量,并切换到webview以显示本地存储的html/javascript文件,该文件为三维模型
  • 第二个tableview是mapview中每个注释所表示的所有相同信息的列表,只是以表格的形式。它在填充变量、切换和在webview中显示html/javascript文件方面具有相同的功能
  • webview显示加载的html/javascript文件,如果没有,则显示UIAlertView以从mapview或列表中选择一个
当我最终从webview执行loadRequest()时,最初一切正常。但是,当我开始在选项卡之间切换并查看不同的3d模型时(即,进入地图视图,单击注释以显示模型x,在webview中查看其加载情况,然后切换到列表表并单击一行以显示模型y(或x)并在webview中查看其加载情况),我开始在ipad上接收到内存泄漏,而不是在模拟器上。这些内存泄漏几乎总是:一般块56、1024、8、244和24,并且没有可跟踪的负责帧、库或堆栈跟踪

在webview中,如果我注释掉loadrequest行或使用request object=nil执行loadrequest,我没有内存泄漏,但当我切换到使用指向本地文件的url对象时(我甚至尝试将其指向带有javascript的google.com),它会爆发内存泄漏

我尝试了以下每一项:

  • [self.webView loadRequest:nil]
  • [self.webView loadHTMLString:@“baseURL:nil]
  • [self.webView停止加载]
在VIEW中,我的webViewController将消失,试图完全清除webview以便将来重用,但它似乎没有多大帮助。在执行loadRequest之前,我也尝试过这样做,但是我得到了相同的内存泄漏

  • 仅供参考,我正在运行最新的xcode 4.0.2,ipad有最新的更新,4.3.2
  • 在我之前的一篇文章中,我发表了评论,但没有收到()的回复。我认为问题在于,当我切换视图时,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;
如果您有任何建议或更正,我将不胜感激。我有一周的时间来解决这个问题,如果您能给我一些见解,我将非常感谢您

谢谢


-迈克

迈克,我不确定你是故意跟随还是错误跟随

- (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?
} 

请查看加载后的注释。。。留言电话。谢谢你的快速回复,拉文,这实际上是我当时正在尝试的东西,但它不起作用,它是故意的。
[self.webView loadHTMLString:@”“baseURL:nil]
已被删除后续:当使用本地html文件仅加载非常大的静态图像(也存储在本地)时,我绝对没有内存泄漏,这与我最初关于接收cfnetwork/http错误的声明相反。很明显,我已经改变了上次观察时的一些东西,这些东西已经停止了泄漏。但是当我切换到加载指向包含javascript(3d模型)的html的对象时,泄漏又回来了。因此uiwebview肯定在努力完成javascript计算,或者有什么东西被拖来拖去,没有完全停止javascript操作只是为了让你知道我面临的是什么,对于我在webView中显示的每10个html/javascript 3d模型,它会产生大约15-20个泄漏,一旦存在一对,从那以后,它非常接近于指数——在尝试不同的东西时,我在调用loadModel之前清除了webview对象:基本上,我取消webview的委托,释放webview,取消它,然后从我的viewDidLoad执行代码。这似乎不会导致泄漏,但在我收到内存警告和应用程序崩溃之前,我只加载了大约2-3个网络视图。我现在收到的唯一泄漏似乎是大量的通用块56、一对288和一两个1024。到底是什么改变了我不能告诉你,但现在它似乎只限于这三种
- (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?
}