2012-02-19 84 views
6

有兩種選擇的目標C /可可構造函數:爲什麼要使用類方法構造函數與alloc/init?

1類構造函數

Product *product = [Product productWithIdentifier:@"Chocolate"]; 
// Use product 

2.分配/ init已構造

Product *product = [[Product alloc] initWithIdentifier:@"Chocolate"]; 
// Use product 
[product release]; 

我做什麼

  • 我傾向於使用類方法,只是因爲它看起來更乾淨,而且不需要發佈。
  • 我看到很多alloc/init - 這樣做有什麼好處?

我的問題

  • 哪一個最好?或者這只是一個品味問題?

代碼

對於背景下,該類產品將有以下:

+(Product *)productWithIdentifier:(NSString *)identifier_ { 
    return [[[[self class] alloc] initWithIdentifier:identifier] autorelease]; 
} 

-(Product *)initWithIndentifier:(NSString *)identifier_ { 
    self = [super init] 
    if (self) { 
     identifier = identifier_; 
    } 
    return self; 
} 

回答

5

如果您使用的是ARC,那麼兩者之間沒有太大區別。如果您不使用ARC,則差異非常重要。

alloc/init組合給你一個擁有的參考。這意味着您稍後必須releaseclassnameWithFoo變體返回一個非擁有的引用。你可能不是release吧。

這遵循通常的可可命名約定。除了以alloccopymutableCopynew開頭的方法之外,所有方法都會返回非擁有(自動發佈)實例。這些返回擁有引用,你必須release

使用哪一個主要是味道的問題。但是,如果您需要可以快速處理的臨時對象,則方法調用(autorelease)的方法調用會稍微少一些,並且在循環中也會減少最大內存佔用量。但是,在大多數情況下,這種降低成本是可以忽略的。

+0

這兩個答案之間的距離非常近,但這稍微好一些,因爲它提到了內存佔用問題。但是,另一個答案再次提到「串聯」呼叫。我希望我可以選擇兩個! – 2012-02-19 18:10:50

+1

我已經upvoted塞爾吉奧的答案几乎彌補這一點;-) – DarkDust 2012-02-19 18:20:04

5

IMO,即使用「類構造函數的兩種方法之間最大的區別來自於一個事實「你得到一個自動釋放的對象;這是當你最方便的選擇:

  1. 分配分配對象爲retain性能;

    創建時
  2. 「臨時」對象(認爲的各種NSString方法,從另一個字符串構建一個字符串:在它發生了,你需要「鏈」這樣的電話很多情況下,構造函數可以讓你「忘記」有關內存管理);

  3. 當您添加對象的一些對象,保留它(認爲:addSubview

在這種情況下「類的構造函數」的語法優勢是最重要的,但我認爲這也使得你的代碼在內存管理方面「更安全」。另一方面,當您創建一個對象以將其分配給assign屬性(或直接添加到您沒有財產的ivar)時,alloc/init將完美並且比「構造函數」(IMO )。

所以,最後,它取決於你將要使用你分配的對象的方式。類構造函數是一種方便的方法。

相關問題