UIWebView没有释放内存

时间:2014-09-23 16:17:39

标签: ios objective-c iphone ipad uiwebview

我已经在Stackoverflow和互联网上检查了所有相关的问题和答案,但我没有得出结论。我正在开发一个ipad应用程序,它的作用是向我的web服务器下载pdf文件作为NSData并在UIWebView中显示它。问题是即使应用程序(关闭)从pdfviewer转移到mainviewcontroller,内存也不会被释放,从而不断增加内存使用量。它以14 mb开始,然后每当我从主控制器转到pdfviewer时,它就会累加起来。由于我使用arc我无法释放它。我也在清理缓存。

Mainview controller.m

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([segue.identifier isEqualToString:@"showpdf"]){
        PdfViewer *pdfviewer=(PdfViewer*)[segue destinationViewController];
        pdfviewer.ReportID=TheReportID;
        pdfviewer.TabID=_TabID;
    }

}

PdfViewer.h

@property (strong, nonatomic) IBOutlet UIWebView *MainWebView;

PdfViewer.m

-(void)viewDidLoad
   {    
      NSURL *url = [NSURL fileURLWithPath:filePath];
      NSURLRequest *request = [NSURLRequest requestWithURL:url];
      [_MainWebView loadRequest:request];
   }

-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender{

    if([segue.identifier isEqualToString:@"ShowMain5"]){
        MainViewController *mv=(MainViewController*)[segue destinationViewController];
        mv.TabID=_TabID;
    }

}
-(void)dealloc{
   NSLog(@"test");
}

我还尝试以编程方式添加UIWebview而不是IBoutlet,但仍然无法解决问题。

以编程方式(替代)

 @implementation PdfViewer

    UIWebView *webview;

    - (void)viewDidLoad
    {    
       webview=[[UIWebView alloc]initWithFrame:CGRectMake(35, 35, 768,959)];
       [webview loadRequest:request];
       [self.view addSubview:webview];
    }

当用户按下后退按钮时,我所做的就是以模态方式返回主视图控件。所有segue都是模态FYI。

据我所知,pdfviewer在调回到mainviewcontroller时没有调用dealloc我检查过是否有人之前有过与viewcontrollers类似的问题而且我发现这个问题UIViewController -dealloc method not called现在我认为内存保持在同一级别,但是现在它给出pdfviewer不在窗口层次结构错误中。

3 个答案:

答案 0 :(得分:2)

根据我对UIWebView [s]的体验,解决方案是为它设置一个单例实例,所以至少这个基本的界面和属性

 // MXMWebView.h
 @interface MXMWebView : NSObject <UIWebViewDelegate, UIScrollViewDelegate> {

  }

  + (instancetype)sharedInstance;

  @property(nonatomic, strong) UIWebView *webView;

 //MXMWebView.m
  @implementation MXMWebView

  @synthesize webView;
  @synthesize delegate;

  #pragma mark - Singleton Methods

  + (instancetype)sharedInstance {
     static id _sharedInstance = nil;
     static dispatch_once_t onceToken;
     dispatch_once(&onceToken, ^{
          _sharedInstance = [[self alloc] init];
     });

   return _sharedInstance;

}

答案 1 :(得分:1)

据我所知,pdfviewer在调回mainviewcontroller时没有调用dealloc。我之前检查过是否有人与viewcontrollers有类似的问题,我发现了这个问题UIViewController -dealloc method not called。所以我添加了

-(void)viewDidAppear:(BOOL)animated{
   [super viewDidAppear:animated];
   self.view.window.rootViewController=self;
}

同时访问mainviewcontroller.m和pdfviewer.m以及

-(void)dealloc{

     [_MainWebView loadHTMLString:@"" baseURL:nil];
     [_MainWebView stopLoading];
     [_MainWebView setDelegate:nil];
     [_MainWebView removeFromSuperview];

    [[NSURLCache sharedURLCache]removeAllCachedResponses];
    [[NSURLCache sharedURLCache] setDiskCapacity:0];
    [[NSURLCache sharedURLCache] setMemoryCapacity:0];

}

pdfViewer.m的方法,它解决了这个问题。感谢大家的贡献。

答案 2 :(得分:0)

将网页视图委托设置为nil,同时从pdfviewer切换到mainviewcontroller

[_MainWebView setDelegate:nil];

---编辑

[_MainWebView removeFromSuperView];