2010-11-23 22 views
1

我讀過在對象的init方法中使用self.ivar =(便捷方法),這很糟糕,因爲這與繼承混淆。在對象的初始化方法中使用self關鍵字指定ivars

但是,如果您知道您不打算子類化您的對象,那麼使用self關鍵字賦值可以嗎?

i.e. self.iVar = [Object objectConvenienceMethod]; 

我問的原因是這個。我用它自己的init方法創建一個新對象,並在該方法中執行各種初始分配。由於我不使用self關鍵字,因此我將它們直接分配給iVar,因此使用alloc方法而不是便捷方法。即

iVar = [[Object alloc] init]; 

或者如果我使用便捷方法,我保留它。即

iVar = [[Object convenienceMethod]retain] 

但是...當我用內存泄漏工具運行我的程序時,所有這些分配都被識別爲內存泄漏。

如果我可以使用self關鍵字加一個方便的方法而不是alloc-init,那麼這可以避免這個問題。

如果我選擇使用alloc-init方法,但我應該在哪裏發佈iVars?只是在dealloc?

感謝您的幫助:)

邁克爾

回答

0

我在想你的「封閉」類沒有被釋放,因此它的dealloc方法沒有被調用導致你的iVars沒有被釋放。

1

如果allocretain他們在您的類的init方法,你應該在相應的dealloc方法釋放他們。

+1

嚴格來說,它是`alloc`而不是`init`,你需要平衡,但它們通常是齊頭並進。 – walkytalky 2010-11-23 17:21:45

+0

謝謝,糾正了我的答案。 – paulbailey 2010-11-23 17:23:05

+0

但我確實在dealloc方法中釋放了它們 - 但是當我創建一個新的對象實例時,泄漏檢測器仍然會將它們識別爲泄漏。 :( – Smikey 2010-11-23 17:23:46

2

不,因爲它不僅僅是需要考慮的子類行爲 - 超類的實現甚至框架生成的代碼的行爲(例如,合成訪問器和用於實現KVO的黑魔法)也會導致問題。它會可能是確定的,但這仍然是一個很好的機會。總而言之,最好只是遵循Apple的建議並直接分配。

在init中分配給ivars不應被報告爲正常運行的程序中的泄漏。如果你看到了,還有一些其他問題需要解決。嘗試將問題簡化爲一個我們可以嘗試並詢問的最小案例 - 然後我們可以確定問題所在。

相關問題