2011-11-06 60 views
5

我想學習目標C,我發現很奇怪的事情之一是什麼時候使用alloc,什麼時候不使用。舉例來說,這段代碼:目標C什麼時候使用alloc和什麼時候不到

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"]; 

爲什麼你不需要做這樣的事情來先分配它?

UIAlert *alert = [[UIAlertView alloc]] 

我敢肯定有剛剛在Objective C的一些基本的東西我失蹤,但奇怪的是我有一個困難時期,而無需繳納找到一個解釋。謝謝!!

+0

@jrturton:正如我所說的,是的,我對它沒有什麼意義,我通常在這裏得到很好的解釋,所以我認爲有人可以給出一個很好的答案。蘋果開發者文檔是可怕的,並且被稱爲是可怕的。請回答我的問題時,請給出實際答案。我會很感激。 – gcoleman0828

+0

在你的問題中沒有任何地方提到你閱讀過文檔或你有問題的部分。不要太防守! – jrturton

回答

6

+alloc的問題是它保留了它的結果,這就是爲什麼它必須在稍後調用-release-autorelease來平衡。爲了避免必須在每次使用類時反覆輸入,API設計者通常創建所謂的便利構造器1便利方法+URLWithString:就是其中之一,並在內部它看起來像這樣:

+ (id)URLWithString: (NSString *)str { 
    return [[[self alloc] initWithString: str] autorelease]; 
} 

所以+alloc獲取調用你,所以是-autorelease

背景

有兩大種在Objective-C的方法:類方法和實例方法。類方法被髮送到類本身,並且不需要創建該類的實例。實例方法被髮送到實例並可以訪問實例佔用的內存。類方法以+開頭;實例方法與-

+alloc是一種類方法。它不是具有特定對象創建能力的魔法。所有在內部做的是一樣的東西:

+ (id)alloc { 
    id result = malloc(class_getInstanceSize(self)); 
    if (result) { 
     memset(result, 0, class_getInstanceSize(self)); 
     result->isa = self; 
     result->retainCount = 1; 
    } 
    return result; 
} 

(它實際上比這更復雜一點,但它應該在這裏足夠了。)請注意+alloc被定義爲NSObject,而不是所有對象的一部分。可可內存管理,有+alloc,-init,-retain,-release等並不總是Objective-C的一部分,並且可以創建不使用它的對象。

實際上,你可以無需調用+alloc如果你知道正確的咒語,創建一個類的實例。我不會推薦它。

+0

謝謝你的詳細解答。這讓我更容易瞭解我所困惑的事情。再次感謝! – gcoleman0828

2

使用alloc方法創建一個由您擁有的新對象。我的意思是像這樣創建它

NSURL *url =[[NSURL allo]initWithString:@"http://www.apple.com"], 你成爲此對象的所有者。你使用它之後,可以說

NSLog ("Url path is %@",url); 

必須釋放這個對象(URL)

[url release]; 

這是關於目標C

那你statment內存管理主要議題之一,

NSURL *url =[NSURL URLWithString:@"http://www.apple.com"];

我必須說,系統將返回一個帶有字符串的url,但不是OWNED BY YOU,所以你不需要釋放它,因爲系統會自動釋放它(這個對象自動發送autorelease消息)

+1

@devcode,好吧,這是有道理的,但我想那麼我的下一個問題是,爲什麼要關心,如果你「擁有它」爲什麼不總是不使用alloc,然後從來沒有擔心釋放它?這會給你買什麼? – gcoleman0828

+0

因爲您擁有自己的對象,您可以控制應用程序使用的內存。你知道在使用這個對象之後,你應該使用方便的構造函數來釋放它(如你所做的那樣),系統並不立即釋放該對象,所以你的應用仍然保留一塊不必要的內存。使用alloc是最好的選擇 – 2011-11-06 14:38:28

相關問題