2011-04-27 59 views
1

我做的第一件事是創建一個ViewController並將其推送到導航控制器。正確地釋放viewController,將其設置爲委託給其他類的自我?

viewController = [[MyViewController alloc] init]; 
[navController pushViewController:viewController animated: NO]; 
[viewController release]; 

保留計數是2(pushViewController使用2保留顯然,但不是我的責任)迄今爲止很好。

Inside MyViewController我創建了一個類的實例,並將ViewController設置爲委託給實例。

timer = [[MyBackgroundTimer alloc] initWithInterval:20]; 
[timer setDelegate:self]; 

現在viewControllers保留計數增加了1 becouse setDelegate的:

但是當我釋放的viewController後,它永遠不會調用dealloc的becouse我還有一個保留計數。

當您將自己設置爲委託時,應如何正確刪除保留計數?

回答

0

您的類MyBackgroundTimer應該將delegate屬性指定爲assign而不保留。

@property (nonatomic, assing) id delegate; 

而這個類應該在需要使用它時保留委託,並在完成時釋放。

@implementation MyBackgroundTimer 

@synthesize delegate; 

-(void) startTimer { 

    [self.delegate retain]; 

    //... do some actions 

} 


-(void) timerStopped { 

    //... call delegate methods 

    [self.delegate release] 

} 

@end 

重要的是要記住,你可以有你的委託作爲保留屬性是非常重要的。但要正確地做到這一點,必須確保在釋放dealloc之前釋放它(如上面示例中的timerStopped方法)

我說因爲如果嘗試在dealloc方法中釋放委託,實例化MyBackgroundTimer的類與委託類相同,它也在dealloc處釋放MyBackgroundTimer(這幾乎是常見的情況),兩個類的dealloc方法都不會被調用,因爲每個類都擁有另一個,導致內存泄漏(這將而不是顯示在儀器上)。

+1

你不應該保留你的代表。當'MyViewController'準備釋放時,它應該釋放'MyBackgroundTimer'或將'MyBackgroundTimer'的委託設置爲零。 – kubi 2011-05-15 19:48:51

+0

甚至讀過答案?多數民衆贊成在我的'你的班MyBackgroundTimer應該有委託財產作爲分配,而不是保留。'...你知道什麼分配意味着什麼? – 2011-05-15 21:17:37

+0

...然後你繼續說,「這個班級應該保留代表......」我誤解了你的答案嗎? – kubi 2011-05-15 21:35:48

2

不要保留你的代表。如果您使用的是屬性,請將您的委託定義爲分配,而不是保留。其他人需要保留你的代表,而不是你。

相關問題