2012-03-15 46 views
1

什麼時候我必須釋放在.h文件中聲明並在我的.m文件中分配的對象viewdidload?自動釋放給我一個錯誤。我是否必須在iOS:何時釋放成員對象?

中發佈它們
-(void)dealloc{ 

} 

方法(如屬性)?

THX

+0

我的事情你是不是obj是否分配內存。 – 2012-03-15 12:23:48

+0

如果你使用alloc,mutableCopy,new,copy來分配內存。然後你釋放。 – 2012-03-15 12:26:05

回答

4

首先,添加[超級的dealloc],這一點很重要:

-(void)dealloc{ 
    [var1 release], var1 = nil; 
    [var2 release], var2 = nil; 
    [super dealloc]; 
} 

其次,是的,你已經保留的實例變量必須由您手動釋放。

+0

是[super dealloc] |總是dealloc方法中的最後一個語句?永遠不要將它看作第一個.. – user944351 2012-03-15 12:31:00

+0

絕不,永遠不要把它放在你的dealloc方法的中間或開始。你的子類變量可能嚴重依賴於超類變量,所以爲了安全起見,子類必須首先被釋放。在開始的時候使用簡單的子類[super dealloc]可以工作,但我建議你習慣在方法的末尾寫下它 - 使代碼易於擴展並且看起來更專業。另請注意,如果您省略[super dealloc],應用程序不會崩潰,但會產生內存泄漏。 – 2012-03-15 12:37:28

+0

非常感謝你的努力! – user944351 2012-03-15 12:46:04

2

如果您使用ARC(在Xcode的最新版本的默認設置),然後保留/釋放可自動插入,你只需要擔心的對象圖(保持引用,當您需要使用一個對象,並避免循環引用)。

如果不是,你是正確的,dealloc是釋放成員變量的正確的地方。儘管專門爲在viewDidLoad中創建的那些,請記住,您的視圖可能會在控制器的生命週期內多次加載/卸載,因此請考慮使用viewDidUnload來釋放這些對象。

0

如果您使用ARC(自動引用計數),你不知道。這是爲你自動完成的。如果你不使用ARC,那麼你可以像正常一樣在dealloc中手動執行它。請注意,新項目將自動使用ARC,如果您嘗試使用release,retainautorelease和對象,ARC會給您一個錯誤。

+0

不,我不使用弧,因爲外部庫不支持這個。 – user944351 2012-03-15 12:32:24

0

是的,你會在一般的釋放他們在dealloc。而且,如果他們在viewDidLoad正在創建的,那麼你可能要釋放他們(和伊娃設置爲nil)在viewDidUnload,特別是如果該對象可以在當前狀態下一次viewDidLoad被稱爲重建。

當然,如果你使用ARC那麼你並不需要顯式釋放你高德在dealloc作爲ARC會產生dealloc實現它可以實現這個要求。

+0

我是否總是要釋放和無對象? – user944351 2012-03-15 12:38:09

+0

在'viewDidUnload'中,肯定是。在'dealloc'中,這取決於。它不會傷害他們,但你可以在這裏讀到更多的問題:-)。 – mattjgalloway 2012-03-15 16:04:44