[英]UIWebView doesn't free memory
我已经在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];
}
当用户按下后退按钮时,我所做的就是以模态方式返回到mainviewcontroller。所有segues都是模态FYI。
据我所知,当pdfviewer切换回mainviewcontroller时,我没有调用dealloc我检查过是否有人之前有过与viewcontrollers类似的问题,我发现这个问题UIViewController -dealloc方法现在没有调用我认为内存保持在同一级别,但现在它给出了pdfviewer不在窗口层次结构错误中。
根据我对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;
}
据我所知,pdfviewer在调回mainviewcontroller时没有调用dealloc。 我检查过是否有人与viewcontrollers之前有类似的问题,我发现这个问题UIViewController -dealloc方法没有被调用 。 所以我补充道
-(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的方法,它解决了这个问题。感谢大家的贡献。
将webview委托设置为nil,同时从pdfviewer segGo到mainviewcontroller
[_MainWebView setDelegate:nil];
---编辑
[_MainWebView removeFromSuperView];
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.