UIWebView中的内存泄漏

3
我头痛已经持续两天了。一个蹩脚的内存泄漏让我变成了绿巨人。 在模拟器上分析代码时,每次加载任何URL请求后都会出现许多泄漏。但是如果我使用像iPhone 5这样的设备,则只有一个泄漏。 最大的问题是仪器不显示任何我的代码。 我记得曾经看过一个很棒的视频教程来定位这些泄漏,但是两天后仍然无果 :( 这是一个适用于Xcode 5的简单项目,当webView属性加载url请求时,它会出现泄漏。
屏幕截图:
更新:添加了整个代码。 更新2:微小的重构。
#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

求助!


你能展示一些代码吗?你使用过ARC吗? - Mirko Catalano
尝试在 viewWillDisApper 方法中将 webview 设置为 nil。 - karthika
我使用ARC,当self.webView 加载页面时出现泄漏。而不是在尝试离开时。 - adnako
请查看此代码:https://github.com/pomozoff/AKWebCoreLeaks/blob/master/AKWebCoreLeaks/AKViewController.m - adnako
在加载页面之前,请尝试停止先前的页面。 - Shaik Riyaz
没有更早的页面了。但我尝试过了,没有帮助。 - adnako
1个回答

0
我不知道你是否展示了所有的代码,所以我猜测你可能没有释放网页视图的代理。 UIWebView 的文档中说:重要:在释放已设置了代理的 UIWebView 实例之前,必须先将其代理属性设置为 nil。例如,在您的dealloc方法中可以这样做。

大家好,我特别为你们制作了一个完整的项目,并将其发布到了GitHub上。为什么你们不想去看呢? - adnako
2
泄漏出现在UIWebView加载页面时!而不是离开时! - adnako

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接