2011-10-05 50 views
1

我在我的ViewController定義的屬性如下如果我沒有在viewDidUnload方法中設置property = nil,那意味着什麼?

@interface QuestionAnswerViewController : UIViewController 
{ 
    Question *question; 
} 

@property (nonatomic, retain) Question *question; 

和我合成的財產在我的.m文件

@synthesize question; 

會不會有什麼問題,如果我不設置「自我。問題= nil'在我的viewDidUnload方法?

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    //Any issues if I don't set this? 
    self.question = nil 
} 

我問這是因爲'question property'實際上是從另一個視圖控制器傳入的。我意識到在低內存的情況下,我的視圖控制器的視圖將自動卸載,所以如果我設置self.question = nil,我將失去當前頁面上的信息(self.question變爲零)。只是想確認沒有將合成屬性設置爲零的影響,以及是否有其他方法來防止這種情況發生。

回答

2

您只能發佈IBOutlets和那些可以輕鬆地在viewDidUnload上重新創建的項目。

如果視圖被卸載,通過內存警告自動說出,沒有減少其保留的任何子組件都不會被卸載,並且內存可能會減少。這最終可能會導致您的應用因內存不足而被終止。

在iOS中,IBOutlet被保留,因此將它們的屬性設置爲無釋放它們。由於包含它們的視圖正在被卸載,所以這些子視圖沒有理由生存,當系統重新加載視圖時,子視圖也將在當時被重新加載。

+0

嗨,感謝您的回答。所以在我的情況下,因爲self.question沒有在viewDidload方法中設置,我不應該在viewdidunload方法中將其設置爲零。但是,這個屬性的保留數呢?我怎樣才能釋放它? – Zhen

+0

相反,因爲它不是IBOutlet,所以完全取決於您,似乎您不希望將其設置爲零並將其鬆開。該對象應該在'dealloc'中釋放:'[釋放問題];'。 – zaph

+0

哦,那麼這意味着如果該屬性不是IOBOutlet,實際上並不需要將它設置爲無視圖卸載?只要在dealloc中釋放它就足夠了(就內存管理而言) – Zhen

1

其含義是那些保留了mainViewsubViews,因爲它們通常具有爲那些聲明的retain計數2作爲retain,一個當它被首次設置,另一種,當它被加入作爲subView,當superView發佈retain計數仍然是一個。

+0

實際的保留計數是未知的,它可能不是2.事實是,該屬性增加了一個保留計數,我們也確定該視圖也是如此。必要時,該視圖將釋放所有留存,我們需要釋放該房產持有的留存。 – zaph