在C++中,如果在內存分配後拋出異常,可能會創建內存泄漏,因此不鼓勵構造函數中的繁重工作。在Java中它仍然令人沮喪,但由於垃圾收集器,它並不重要。在目標C中,init方法中關於繁重提升的立場在哪裏?在目標C中執行工作初始化
4
A
回答
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;
}
相關問題
- 1. 初始化列表中的目標C
- 2. 目標C初始化協議中
- 3. 對象在目標C未初始化
- 4. 工會初始化在c
- 5. 初始化工作
- 6. noty在初始化工作
- 7. 從目標C庫初始化Swift類
- 8. 數組初始化器目標C
- 9. 如何在spark中執行初始化?
- 10. 在EJB3.1中執行初始化代碼
- 11. 執行-init vs. +初始化
- 12. 可執行初始化
- 13. 在多線程C#程序中執行一次初始化
- 14. ES2015初始化不工作
- 15. RavenDb初始化工作不
- 16. 目標C數組UIButtons(包括照顧初始化,動作等)
- 17. 我應該在哪裏初始化目標c中的變量?
- 18. 初始化在C++
- 19. 初始化在C++
- 20. 初始化在C++
- 21. 初始化在C++
- 22. 正在初始化一個C結構陣列 - 目標C - OpenGLES
- 23. 在C++中初始化類
- 24. 在C#中初始化Var#
- 25. 函數包裝器初始化在C++ 11中如何工作?
- 26. 字典初始化如何在C#中工作?
- 27. c#初始化
- 28. C++初始化
- 29. C++ - 初始化與骨料初始化
- 30. 在C++中使用標記進行靜態結構初始化
Apple的UIView類建議你在viewDidLoad方法中舉重,所以我懷疑類似的規則是有效的。 – 2012-03-02 17:40:03
實際上,當一個'init'方法在iPhone Objective C中失敗時,應用程序可能已經死了。當然,也有例外情況,但它們是根據具體情況處理的。所以這主要是一個關於你想要「純」的問題,以及你的應用程序是否需要特別強大。 – 2012-03-02 19:00:32
@HotLicks是這樣的,除非有人沒有遵循不拋出init的約定,在這種情況下它會失敗? – zode64 2012-03-02 19:59:28