2012-03-02 36 views
4

在C++中,如果在內存分配後拋出異常,可能會創建內存泄漏,因此不鼓勵構造函數中的繁重工作。在Java中它仍然令人沮喪,但由於垃圾收集器,它並不重要。在目標C中,init方法中關於繁重提升的立場在哪裏?在目標C中執行工作初始化

+2

Apple的UIView類建議你在viewDidLoad方法中舉重,所以我懷疑類似的規則是有效的。 – 2012-03-02 17:40:03

+0

實際上,當一個'init'方法在iPhone Objective C中失敗時,應用程序可能已經死了。當然,也有例外情況,但它們是根據具體情況處理的。所以這主要是一個關於你想要「純」的問題,以及你的應用程序是否需要特別強大。 – 2012-03-02 19:00:32

+0

@HotLicks是這樣的,除非有人沒有遵循不拋出init的約定,在這種情況下它會失敗? – zode64 2012-03-02 19:59:28

回答

3

總的指導意見是,對於任何昂貴的東西來說,延遲加載是首選。一般來說,init應避免昂貴的通話,因爲您可能不需要結果。也許調用者創建這個對象,然後拋出它,或者只看一個值。您希望避免創建不需要的大量數據結構。這一指導旨在提高績效;這不是一條硬性規定。

這是可以接受的,但不常見,允許init失敗並返回nil。在這裏查看bbum的答案是否正確:Returning nil in the init in Objective C code

3

在Objetive-C,對於一個初始的模式是

-(id)init 
{ 
    if (self = [super init]) { 
     // Initialization code here 
    } 
    return self; 
} 

如果初始化失敗,則應該返回nil。這意味着如果您的初始化程序失敗,它需要正確釋放self以避免泄漏。所以我想你只要遵循這個模式就很安全。

-(id)init 
{ 
    if (self = [super init]) { 
     if (myInitializationFunc() == ERR_FAIL) { 
      [self release]; 
      return nil; 
     } 
    } 
    return self; 
}