2010-06-05 85 views
0

我正在開發一個iPhone應用程序,而且我對iPhone開發非常新穎。對我的自定義目標Dealloc-C

我創建了一些帶有實例變量(NSArray,NSString等)的自定義類。所有類都從NSObject繼承。

我應該創建一個dealloc方法來釋放所有實例變量嗎?

謝謝。

+0

這是一個普遍的問題。我正在安裝像NSArray和NSString的對象,我想我必須釋放它們。但我看到一些示例代碼,這些實例變量未被釋放。 – VansFannel 2010-06-05 16:43:54

回答

3

是的,如果你保持實例變量是對象,你肯定需要一個dealloc。您也可能需要保留或複製這些內容,具體取決於您的對象如何創建/使用它們。

檢查出內存管理this article。我認爲它解釋得很好。您還必須閱讀Memory Management Programming Guide for Cocoa。即使你沒有完全理解所有的東西,閱讀整篇文章,然後閱讀文章,然後做一些工作,得到一些崩潰,並再次閱讀它:)最終它應該點擊。

+0

不是,不。 '保持實例變量是對象'的任何內容都不意味着你有一個dealloc方法。 – hooleyhoop 2010-06-06 00:03:24

+0

@mustISignUp:除非他們被簡單分配或者所有的單身人士,否則你會。由於對象作爲實例變量應該被分配(例如委託)和對單例的引用是極少數情況,那麼是的,你必須有一個dealloc方法。我的措辭可能有點過於強硬,但初學者應該習慣於編寫適當的拆卸方法。 – 2010-06-06 03:14:35

+0

這是誤導。這聽起來像dealloc方法是特殊的 - 它不是。 – hooleyhoop 2010-06-06 07:54:41

0

在iPhone開發中,由於沒有垃圾收集,所以它的SOP非常多,有一個dealloc。

0

您必須發佈您的課程擁有所有權的任何對象。這意味着,是的,你必須覆蓋dealloc方法並釋放那裏的對象。

通常情況下,您對實例變量中的值(對象)擁有所有權,但它也取決於您自己創建的

你一定要閱讀Memory Management Programming Guide,當你獲得所有權時,它會很好地描述。

+0

你不必發佈和反對你的課程擁有所有權(這甚至不意味着什麼)。如果你想釋放一個對象,你肯定不需要通過覆蓋(sic)dealloc來完成它。 – hooleyhoop 2010-06-06 00:09:16

+0

@mustISignUp:你說得對,我的措辭不好。當然,你可以隨時釋放一個對象。但我仍然認爲如果您擁有所有權,您必須釋放它,這意味着您保留了該對象(因此增加了保留計數)。除了垃圾收集(iPhone上不存在),否則保留計數如何減少? – 2010-06-06 01:53:02

0

是的,擁有dealloc方法通常是最好的方法。

如果你想回收你的實例變量使用的內存,你將不得不在他們完成後釋放它們。您可以添加的方法來做到這一點清理: -

- (void)cleanUp { 
    [myArray release]; 
    [myString release]; 
} 

調用它,當你不再需要的實例。

現在,當你想釋放這些變量的時間點是他們的父對象被銷燬的時間點(父對象不見了,所以不再需要實例變量)。因爲-dealloc會在父對象將被銷燬時自動調用 - 將cleanup代碼放在dealloc中比在我們必須在正確的時間調用的-cleanup方法更有意義。

如果你不想重用內存,例如。如果你是永遠不會將完成實例變量,那麼你不需要釋放它們,並且可能不需要-dealloc。

+0

..你想要將這些實例變量設置爲'nil',否則當真正的dealloc被調用時,你會雙重釋放它們。 – Jason 2010-06-05 17:09:30

+0

errrrrrr,它更多的是不做的例子! – hooleyhoop 2010-06-05 17:18:50