我已经在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不在窗口层次结构错误中。
答案 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];