當您在一個對象上多次調用-init時會發生什麼情況,是否存在一些隱藏的副作用? 你能否假設沒有額外的內存分配? 會有什麼違背這樣的想法?在Objective-C中多次調用-init
7
A
回答
31
調用-init
多次未定義,不受支持,並且將導致錯誤,崩潰和其他意外行爲。
很多類 - NSString
,NSArray
,並NSDictionary
,例如 - 實際上沒有分配任何當的+alloc
方法被調用。直到調用各種-init*
方法之一,該對象纔有足夠的上下文來找出最有效的方法來做你所要求的任何事情。
3
我在Bill的答案中添加的一件事是,在編寫自己的-init
方法時,需要防禦性編碼,並且不要認爲它們只會被調用一次。
+2
如何優雅地檢查對象沒有調用init方法? – jbat100 2011-10-18 22:40:16
相關問題
- 1. ObjectiveC分配和init?
- 2. GAE Go,init() - 多次調用它?
- 3. 在init中調用init,在self = [super init]之前調用
- 4. PHP init被調用兩次?
- 5. init()方法調用在每次請求
- 6. 從Objectivec中調用C main
- 7. Android ACRA#init多次呼叫
- 8. IIS模塊:Init()在網站中僅被調用一次?
- 9. Init方法在@Viewscoped bean中調用兩次
- 10. 從objectiveC調用javascript函數
- 11. 只要init調用[super init],在Objective C自定義init方法中調用[self init] OK?
- 12. 從ObjectiveC中調用子方法(IOS6)
- 13. 在super.init中調用init中的classForCoder
- 14. 調用C++方法回調ObjectiveC
- 15. 多次調用
- 16. viewDidLoad在init之前調用?
- 17. 類init在newInstance調用中失敗
- 18. 在servlet的doget()方法中調用init()
- 19. Tomcat - Servlet init()在啓動時調用兩次
- 20. ObjectDataSource在嵌套GridView中調用多次
- 21. 在jQuery中多次調用函數
- 22. 在hibernate中多次調用插入?
- 23. getItem()在FragmentPagerAdapter中多次調用
- 24. 在Android視圖中多次調用inflate()
- 25. 多次在jQuery函數中調用ColdFusion.Ajax.submitform()
- 26. $ http在AngularJS中被多次調用
- 27. didUpdateLocations在swift中被多次調用3
- 28. 函數在Node.js中多次調用
- 29. OnScoll在ListView中多次調用
- 30. 調用$(document).foundation();在Foundation中多次
不,你不能假定一個對象的初始值設定項沒有分配內存。你爲什麼想要擺在首位? – 2010-01-01 20:26:48
我使用IB創建一個對象並將其與相應的控制器插座相連接。我觀察到這個對象被初始化了,所以假定+ alloc和-init必須被調用。所以問題出現了,如果我可以用不同的值再次初始化對象。 – CipherCom 2010-01-01 22:47:40
如果你已經在Interface Builder中實例化了一個對象,你需要重寫'-initWithCoder:',因爲它會被調用而不是'-init',因爲對象被存檔在nib中,並且必須被解除存檔才能被應用程序使用。或者,只需實現'-awakeFromNib'並在那個地方改變你想要的任何設置。 – 2010-01-02 01:13:02