【问题标题】:UIWebView leakingUIWebView 泄漏
【发布时间】:2011-09-01 17:08:30
【问题描述】:

我有一个扩展 UIViewController 并实现 UIWebViewDelegate 的类,如下所示:

@interface TableViewController : UIViewController <UIWebViewDelegate, UIAlertViewDelegate>{
    UIWebView *articleWebView;
    NSString *link;
    UIActivityIndicatorView *activityIndicator;
    NSURL * safariUrl;
}

我正在尝试将网页加载到 uiwebview 中,一切正常,但我遇到了一些泄漏(如 GeneralBlock-56、GeneralBlock-1024 等),我无法找出它们来自哪里。
这就是我正在做的:

- (void)viewDidLoad {
[super viewDidLoad];

if (articleWebView){
    [articleWebView loadHTMLString: @"" baseURL: nil];
    [articleWebView release];
    articleWebView = nil;
}

articleWebView = [[UIWebView alloc] initWithFrame: CGRectMake(0,0,320,380)];
if (activityIndicator){

    [activityIndicator release];
    activityIndicator = nil;
}
activityIndicator = [[UIActivityIndicatorView alloc]initWithFrame:CGRectMake(self.view.bounds.size.width/2-24, self.view.bounds.size.height/3-12, 50, 50)];
activityIndicator.activityIndicatorViewStyle = UIActivityIndicatorViewStyleGray;
[self.view addSubview:activityIndicator];


link = [link stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
link = [link stringByTrimmingCharactersInSet:[NSCharacterSet newlineCharacterSet]];
link = [(NSString*) CFURLCreateStringByAddingPercentEscapes (NULL, (CFStringRef)link, NULL,
                                                             NULL, kCFStringEncodingUTF8) autorelease];


NSURL *url = [NSURL URLWithString:link];
NSURLRequest *requestObj = [NSURLRequest requestWithURL:url];   

[[self articleWebView] setDelegate: self];

[articleWebView loadRequest:requestObj];

[link release];

}

//////////////////////////////////////////////
-(void)webViewDidFinishLoad:(UIWebView *)webView{
if (activityIndicator){
    [activityIndicator stopAnimating];
    [activityIndicator release];
    activityIndicator = nil;
    self.view = articleWebView;

}
//////////////////////////////////////////////
- (void)viewDidUnload {
    [super viewDidUnload];
    [articleWebView loadHTMLString: @"" baseURL: nil];
    [self.articleWebView release];
    self.articleWebView = nil;
}
//////////////////////////////////////////////
- (void)dealloc {
    self.articleWebView.delegate=nil;
    [super dealloc];
}

我做错了什么?提前谢谢你。

【问题讨论】:

    标签: iphone objective-c memory-leaks uiwebview


    【解决方案1】:

    如果articeWebviewIBOutlet 为什么你要allocate 它??

    【讨论】:

    • 非常感谢您的回答。你是对的,起初我虽然我会通过 Interface Builder,然后改变主意但忘记删除 IBOutlet。我会更新我的问题。无论如何,删除它仍然会留下 2 个泄漏(GeneralBlock56、GeneralBlock-1024)。任何想法我做错了什么?
    • 哪个对象负责泄漏。使用构建并分析并查看泄漏是如何发生的。只需确保在不再需要时释放您拥有的所有对象
    • 我已经试过这些了。在 Instruments 中,当我尝试双击泄漏以查看泄漏的来源时,它只是显示“不可用”,因此我无法找出泄漏的来源。无论如何,谢谢你的尝试:)
    【解决方案2】:

    除了将 webView 委托设置为 nil 之外,您还应该要求您的 webView 停止加载。添加以下代码行,然后尝试:

    - (void)dealloc {
        self.articleWebView.delegate = nil;
        [articleWebView stopLoading];
        [articleWebView release];
        [super dealloc];
    }
    

    【讨论】:

    • @HD 感谢您的回答。那也没有帮助。此外,我认为当我查看 uiwebview 时不会调用 dealloc 方法,所以我不认为 dealloc 中缺少某些东西 - 我错了吗?在 uiwebview 加载并变得可见时,就会出现泄漏。
    猜你喜欢
    • 1970-01-01
    • 2015-04-08
    • 1970-01-01
    • 2013-11-13
    • 2011-09-19
    • 2010-10-13
    • 2011-04-08
    • 2011-09-26
    相关资源
    最近更新 更多