2011-03-28 43 views
0

所以我試圖將一個簡單的URL(http://www.google.com)加載到Web視圖中。我在與之合作的應用程序中使用了這個函數,但將其歸結爲基本應用程序以刪除其他變量。我有一個絕對的最小的應用程序設置,一個視圖控制器與Web視圖作爲其主要視圖。對於代碼我有UIWebView loadRequest在模擬器中導致崩潰

-(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]; 
} 

當它加載時,我得到一個EXC_BAD_ACCESS崩潰在Web線程。我不確定這是否是與我在模擬器中工作有關的問題,或者是我剛剛與設置搞砸的事情。

回答

3

請勿打電話dealloc。改爲撥打urlurlString即可撥打release

這是因爲其他對象具有對這些對象的引用,並且當您說dealloc時,您明確地銷燬它們。這導致EXC_BAD_ACCESS,因爲當其他對象試圖訪問URL和字符串對象時,它們已被銷燬。

這是引用計數的整點。你完成了這些對象,所以如果你說:

[url release]; 
[urlString release]; 

你正在聲明。這會減少對這些對象的引用計數。但截至上面,你說:

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

這意味着url可能有該字符串的引用。所以當你創建它時,它會編輯它retain。因此,釋放字符串後,它不會被破壞,因爲url仍然有一個引用。當IT完成它時,它也會釋放它,然後(如果沒有其他人聲稱該對象),它將自動爲dealloc ed,因爲它的計數將降到零。

在處理這種內存管理時,一定要記住還有誰會使用你的對象。您可以在Apple's docs中閱讀更多信息。

+0

噢,好點...我通常是一個C++程序員,所以這個託管的東西對我來說很新。謝謝 – 2011-03-28 16:39:48

+0

@丹F:哈哈沒問題。與'new'和'delete'等相比,很容易忘記。我想我更喜歡這個方案。 =) – 2011-03-28 16:45:24