UIWebView中的内存泄漏

时间:2013-10-11 09:57:57

标签: ios memory-leaks uiwebview instruments

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

屏幕截图: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!

1 个答案:

答案 0 :(得分:0)

我不知道您是否显示了所有代码,因此我猜您可能不会发布Web视图的委托。 UIWebView delegate媒体资源的文档说明:

  

重要提示:在发布您UIWebView的实例之前   设置了委托,您必须先将其委托属性设置为nil。   例如,可以在dealloc方法中完成此操作。