2010-06-22 41 views
4

使用委託進行內存管理,我的理解是我不保留委託,如果視圖被卸載(通過viewDidUnload)並稍後重新創建(通過viewDidLoad),我有點不確定如何處理委託?與代表的內存管理?

@property(assign) SomeClass *someDelegate; 

- (void)viewDidLoad { 
    [super viewDidLoad]; 
    someDelegate = [[SomeClass alloc] init]; 
    [someDelegate setDelegate:self]; 
} 

-(void)viewDidUnload { 
    [super viewDidUnload]; 
    [self setSomeDelegate:nil]; 
} 

-(void)dealloc { 
[super dealloc]; 
} 

PS:我可能是在錯誤的軌道上,我只是試圖讓我的頭一輪這...

歡呼加里

+0

編輯以反映代理更正/評論。 – fuzzygoat 2010-06-22 15:37:30

回答

2

如果使用分配你的財產,你」不要在對象上調用保留。

這意味着你絕對不應該調用release或者autorelease!

你在你的dealloc

[someDelegate release]; 

行將會導致在某個時刻崩潰倒在未來的 - 你應該將其刪除。您不需要關心dealloc方法中指定的屬性。

你行

[self setSomeDelegate:nil]; 

不會泄漏。


但是,你似乎有[[someDelegate alloc] init]viewDidLoad方法。這是不尋常的;代表是一個外部對象,而不是由你自己製作的,這是正常的。在你的情況下,它不是一個真正的委託,它只是一個爲你做點事情的對象 - 你應該重新命名它並將屬性改爲retain(並且記住在dealloc中釋放它)。

目前,如果您的財產設置爲(分配)並且其他人設置了它,則會泄漏您的初始代理人。如果你只在這個類中使用委託,也許它不應該是一個屬性?如果你只是想能夠在類的外部讀它,你可能能夠使用(只讀),而不是分配(並更改[self setSomeDelegate:nil]someDelegate=nil;

你在viewDidUnload行設置委託給無刪除問題你在你的第二個評論提高 - 您要移除委託這樣的時候你到viewDidLoad再次,您的代理已經是零:)

+0

我明白了,謝謝Dean。我對@property(assign)的工作方式感到困惑。 – fuzzygoat 2010-06-22 15:18:03

+0

因此,假設我在viewDidLoad中有一個[[someDelegate alloc] init],如果視圖卸載並再次調用viewDidLoad,會發生什麼?每次我調用viewDidLoad時,我都會得到一個新的someDelegate並泄漏舊的? – fuzzygoat 2010-06-22 15:22:43

+0

查看我剛剛編輯的編輯:) – deanWombourne 2010-06-22 15:36:56

1

This可能會提供一些線索來理解爲什麼

原因你避免保留代表是你n EED到 避免保留週期:

A創建BA將自身設置爲B的委託...... A是由它的主人釋放

。如果B保留了A,A將不會被釋放,因爲B擁有A,從而A的 dealloc永遠不會被調用,導致A和B都泄漏。

你不應該擔心A會離開,因爲它擁有B,因此它在dealloc中被清除掉了 。

+0

謝謝安德斯,多數民衆贊成在很有幫助... – fuzzygoat 2010-06-22 15:43:12