3

ここ 2 日間、頭 (お尻) が痛いです。危険なメモリ リークが私をハルクにします。シミュレーターでコードをプロファイリングするときに、カスタム UIWebView で URL 要求を読み込んだ後、多くのリークが発生します。しかし、iPhone 5 のようなデバイスを使用している場合、リークは 1 つだけです。大きな問題は、Instruments が私のコードの行をまったく表示しないことです。これらのリークを見つけるための素晴らしいビデオ チュートリアルを見たのを覚えていますが、グーグルで調べても 2 日で結果が得られませんでした :( Xcode 5 の簡単なプロジェクトを次に示します。webView プロパティが URL リクエストをロードしたときにリークします。

スクリーンショット: 1 つ2 つ

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

ヘルプ!

4

1 に答える 1

0

すべてのコードを表示しているかどうかわからないので、Web ビューのデリゲートを解放していない可能性があると推測します。UIWebView delegateプロパティのドキュメントには次のように記載されています。

重要:デリゲートを設定した のインスタンスを解放する前に、UIWebViewまずそのデリゲート プロパティを に設定する必要がありますnil。これは、たとえば、dealloc メソッドで行うことができます。

于 2013-10-11T10:33:29.590 に答える