2013-10-11 58 views
3

我最近两天头部(臀部)疼痛。一个狡猾的内存泄漏让我成为绿巨人。 在模拟器上分析代码时,在自定义UIWebView中加载任何url请求后出现大量泄漏。但是如果我使用像iPhone 5这样的设备,只会有一处泄漏。 巨大的麻烦是仪器没有显示任何我的代码行。 我记得我看到了一个巨大的视频教程,以找到这些泄漏,但谷歌搜索在两天:( 这里是Xcode的5简单project没有结果,它泄漏当web视图属性加载的URL请求。UIWebView中的内存泄漏

截图:onetwo

UPD:。增加了整个代码 UPD2:!微小的重构

#import "AKViewController.h" 

@interface AKViewController() 

@property (nonatomic, strong, readonly) UIWebView *webView; 

@end 

@implementation AKViewController 

@synthesize webView = _webView; 

#define MARGIN_WEB_VIEW_X 15.0f 
#define MARGIN_WEB_VIEW_TOP 30.0f 
#define MARGIN_WEB_VIEW_BOTTOM 25.0f 

#pragma mark - Private methods 

- (CGRect)makeRectForWebView { 
    CGRect appFrame = UIScreen.mainScreen.applicationFrame; 
    CGRect rectWebView = CGRectMake(MARGIN_WEB_VIEW_X, 
            MARGIN_WEB_VIEW_TOP, 
            appFrame.size.width - MARGIN_WEB_VIEW_X * 2, 
            appFrame.size.height - MARGIN_WEB_VIEW_BOTTOM); 

    return rectWebView; 
} 
- (void)presentViews { 
    [self.view.subviews makeObjectsPerformSelector:@selector(removeFromSuperview)]; 

    self.webView.frame = [self makeRectForWebView]; 
    [self.view addSubview:self.webView]; 
} 
- (NSURLRequest *)makeLoginURLRequest { 
    NSString *stringUrl = @"http://google.com/"; 
    NSURL *url = [NSURL URLWithString:[stringUrl stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]]; 
    NSURLRequest *request = [NSURLRequest requestWithURL:url]; 

    return request; 
} 

#pragma mark - Properties 

- (UIWebView *)webView { 
    if (!_webView) { 
     _webView = [[UIWebView alloc] initWithFrame:UIScreen.mainScreen.applicationFrame]; 
     _webView.scalesPageToFit = YES; 
    } 

    return _webView; 
} 

#pragma mark - Lifecycle 

- (void)viewDidAppear:(BOOL)animated { 
    [super viewDidAppear:animated]; 

    [self presentViews]; 
} 

- (void)viewDidLoad { 
    [super viewDidLoad]; 

    self.view.backgroundColor = [UIColor grayColor]; 
    [self.webView loadRequest:[self makeLoginURLRequest]]; 
} 

@end 

HELP

+0

你能显示一些代码吗?你用过ARC吗? –

+0

尝试在viewWillDisApper方法中设置webview = nil。 – karthika

+0

我使用ARC,当self.webView **加载**页面时出现泄漏。不是当它试图离开。 – adnako

回答

0

我不知道你是否显示了所有的代码,所以我会猜测你可能不会释放Web视图的代表。为UIWebViewdelegate属性的文件说:

重要:之前释放的UIWebView为您 设置了委托实例,您必须首先其委托属性设置为nil。 这可以在你的dealloc方法中完成。

+0

伙计们,我特别为你做了一个完整的项目并将其发布到GitHub。为什么你不想在那里看到? – adnako

+2

当UIWebView **加载**页面时出现泄漏!不在它离开时! – adnako