2011-05-25 25 views
0

我在這裏有一個相當基本的問題。我發現,很多時候我實例在viewDidLoad中模型對象:視圖控制器的方法,比如在用來填充表的元素在視圖控制器Web服務對象的情況下:iOS:何時最好在視圖控制器中取消分配模型對象?

- (void)viewDidLoad { 
    [super viewDidLoad];  
    itemService = [[BlogItemService alloc] init]; 
} 

在哪裏我應該釋放itemService嗎?在viewDidUnload或dealloc?

此外,在viewDidLoad中分配像這樣的對象是否很常見?有沒有更適合的init類型的方法?

更新:我特別關心。假設我在dealloc中取消分配itemService。如果視圖被卸載然後重新加載,但視圖控制器未被釋放,那麼當新實例被實例化時,是否會因爲itemService的前一個實例是孤立的而導致內存泄漏?

回答

0

這是非常罕見的情況,但是如果您卸載並再次加載視圖,則會按照您的建議泄漏。那麼在哪裏分配對象是一個很好的問題,它取決於你的選擇。可能最好在每次加載視圖時加載對象,因爲它們非常沉重,並且一些小對象可能會更容易在init中加載。但是,如果要多次加載和卸載視圖,您還必須小心處理視圖控制器,因爲常見模式是每次視圖消失時(主要是很好的解決方案)都會銷燬控制器。

0


你應該釋放對象的dealloc

可以使用分配內存:

itemService=[BlogItemService new]; 
+0

感謝尼蒂什..我的下一個問題則是:如果出於某種原因的觀點被卸載,然後重新加載(但視圖控制器不釋放)我不會有內存泄漏,因爲itemService將在第二次調用viewDidLoad並且itemService的前一個實例變爲孤立時重新分配。 – DingoSalad 2011-05-25 10:14:15

+0

不,不會有任何內存泄漏,因爲您每次卸載視圖時都會執行 - (void)viewDidUnload。 – Nitish 2011-05-25 10:18:32

+0

如果您發現有用的答案,您可以接受它。 – Nitish 2011-05-25 10:25:30

0

如果你會問我來初始化模型對象是在類的init方法最好的地方release它在dealloc

1

我應該在哪裏發佈itemService?在viewDidUnload或dealloc?

如果對象很輕或需要很長時間才能創建,請在dealloc中執行此操作。如果消耗大量內存,則在viewDidLoad/viewDidUnload中使用匹配對。

此外,在viewDidLoad中分配像這樣的對象是否很常見?

有沒有更合適的init類型的方法?

指定初始化(在某些情況下)

更新:我有一個特別的關注。假設我在dealloc中取消分配itemService。如果視圖被卸載然後重新加載,但視圖控制器未被釋放,那麼當新實例被實例化時,是否會因爲itemService的前一個實例是孤立的而導致內存泄漏?

避免這種情況,使用:

BlogItemService * item = [[BlogItemService alloc] init]; 
self.itemService = item; 
[item release], item = nil; 
相關問題