+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
如果你知道正確的咒語,創建一個類的實例。我不會推薦它。
@jrturton:正如我所說的,是的,我對它沒有什麼意義,我通常在這裏得到很好的解釋,所以我認爲有人可以給出一個很好的答案。蘋果開發者文檔是可怕的,並且被稱爲是可怕的。請回答我的問題時,請給出實際答案。我會很感激。 – gcoleman0828
在你的問題中沒有任何地方提到你閱讀過文檔或你有問題的部分。不要太防守! – jrturton