2011-05-30 70 views
1

我知道如果我通過使用屬性來保留IBOutlet,那麼我必須將它設置爲零,但viewDidUnload中的其他值呢?release view in viewDidUnload

例如,我有三個子視圖廠景,視圖2和視圖3,從筆尖該載荷,這是控制器的頭文件

@interface MyViewController : UIViewController { 
    IBOutlet UIView *view1; 
    UIView *view2; 
    //no reference for view3 
} 
@property (nonatomic, retain) IBOutlet UIView *view2; //property view2 is an IBOutlet!! 
@end 

和方法viewDidUnload

- (void)viewDidUnload { 
    self.view2 = nil; 
    //[view1 release]; 
    //view1 = nil; 
    [super viewDidUnload]; 
} 

我必須釋放view1並將其設置爲零?或UIViewController將它設置爲零爲我? view3怎麼樣?

我也必須釋放view1在dealloc

編輯: 我想很多人不理解我的問題

首先,廠景是一個IBOutlet其宣佈爲伊娃和分配伊娃不會保留。我知道UIViewController肯定會保留它,但我必須釋放它,否則UIViewController會爲我釋放它?如果UIViewController會釋放它,那麼我不得不再次釋放它。

其次,view2也是一個IBOutlet,雖然它被聲明爲屬性不是伊娃。

@property (nonatomic, retain) IBOutlet UIView *view2; 

這是一個保留屬性,因此設置將保留它,所以我知道我必須把它設置成零,以釋放它。我對此毫無問題。

對於view3,沒有參考,因此我假設我不必做任何事情。我還假設不需要爲筆尖中的every對象做參考。

+0

爲什麼沒有'view3'的參考? – 2011-05-30 09:42:21

+0

不是答案,但如果您在理解引用計數時遇到問題,只需記錄它們:'NSLog(@「view1 retainCount:%d」,[view1 retainCount])'。這將幫助您查看要發佈哪些視圖。還要玩弄「泄漏」工具(build - > profile)。請記住,這並不總是會發生泄漏,例如,當viewController從未被釋放時(因爲從技術上講,這不是問題 - 但它是更好的風格)。 – fzwo 2011-05-30 09:47:55

+0

@Deepak我必須爲每個子視圖做一個參考嗎? – 2011-05-31 02:48:14

回答

0

即使沒有爲他們聲明的屬性,所有插座仍保留默認狀態。所以你需要釋放它們。如果你繼續申報assign作爲出路,那麼你不需要發佈,但是你不能依賴它,因爲你不是所有者。

所以你需要釋放view1view2,因爲它們被聲明爲插座。 view3是一個不存在的變量,因此不必擔心。

+0

出口提到view2在這裏@屬性(非原子,保留)IBOutlet UIView * view2;' – 2011-05-31 09:58:43

+0

編輯答案。 – 2011-05-31 10:18:11

+0

這很清楚。謝謝。 – 2011-05-31 10:46:10

0

當加載一個筆尖時,它的所有對象都會自動實例化並保留下來。 您的nib文件的文件所有者是您的UIView的所有者。

如果您使用UIView * view2,則無法使用界面構建器連接它們。 所以這對我來說並沒有什麼意義。

你也必須在dealloc中發佈。

- (void)viewDidUnload { 
    self.view1 = nil; 
    self.view2 = nil; 
    [super viewDidUnload]; 
} 

- (void)dealloc { 
    [self.view1 release]; 
    self.view1 = nil; 
    [self.view2 release]; 
    self.view2 = nil; 
} 
+1

我可以連接view2屬性和屬性將保留view2我。爲你的'dealloc'代碼,爲什麼釋放然後設置爲零?我認爲這會導致崩潰,因爲將屬性設置爲零將再次釋放,因爲這是一個保留屬性 – 2011-05-31 02:46:26