【问题标题】:UIWebView loadRequest causing a crash in simulatorUIWebView loadRequest 导致模拟器崩溃
【发布时间】:2011-07-24 15:19:16
【问题描述】:

所以我试图将一个简单的 URL (http://www.google.com) 加载到网络视图中。我在我正在使用的应用程序中有这个,但将其归结为一个基本应用程序以删除其他变量。我有一个绝对最小的应用程序设置,一个以 webview 作为主要视图的视图控制器。对于代码我有

-(void)viewDidLoad
{
    [super viewDidLoad];

    UIWebView *webView = (UIWebView*)self.view;
    NSMutableString *urlString = [[NSMutableString alloc] initWithString:@"http://www.google.com"];
    NSURL* url = [[NSURL alloc] initWithString:urlString];
    NSURLRequest *urlRequest = [[NSURLRequest alloc] initWithURL:url];
    NSLog(@"Sending web request to %@", urlString);

    [webView loadRequest:urlRequest];

    [urlRequest release];
    [url dealloc];
    [urlString dealloc];
}

当它加载时,我在 Web 线程中遇到 EXC_BAD_ACCESS 崩溃。我不确定这是与我在模拟器中工作有关的问题,还是我刚刚搞砸了设置。

【问题讨论】:

    标签: iphone objective-c ios memory-management uiwebview


    【解决方案1】:

    请勿致电dealloc。请改为在url 和urlString 上致电release。

    这是因为其他对象有对这些对象的引用,当你说dealloc 时,你是在明确地销毁它们。这是造成EXC_BAD_ACCESS的原因,因为当其他对象试图访问url和string对象时,它们已经被销毁了。

    这就是引用计数的全部意义所在。你已经完成了这些对象,所以如果你说:

    [url release];
    [urlString release];
    

    您正在声明这一点。这会减少对这些对象的引用计数。但在上面,你说:

    NSURL* url = [[NSURL alloc] initWithString:urlString];
    

    这意味着url 可能有对该字符串的引用。所以当你创建它时它会retained 它。因此,在您释放字符串后,它不会被破坏,因为url 仍然有对它的引用。当 IT 处理完毕后,它也会释放它,然后(如果没有其他人拥有该对象的所有权),它会自动成为 dealloced,因为它的计数将降至零。

    在处理此类内存管理时,请始终牢记还有谁可能在使用您的对象。您可以在Apple's docs 阅读更多相关信息。

    【讨论】:

    • d'oh,好点...我通常是一个 C++ 程序员,所以这个托管的东西对我来说很新。谢谢
    • @Dan F:哈哈没问题。与new 和delete 等相比,它很容易忘记。不过我想我更喜欢这个方案。 =)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-03-17
    • 1970-01-01
    • 2015-04-17
    • 2014-02-20
    • 2011-09-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多