0

我在我的程序中使用了一個NSXMLParser類,併爲其指派了一個委託。 但是,這個委託被setDelegate:方法保留,導致一個小問題,但令人討厭的:-)內存泄漏。NSXMLParser的委託和內存泄漏

我無法在setDelegate之後釋放委託類:因爲程序會崩潰。

這裏是我的代碼:

self.parserDelegate = [[ParserDelegate alloc] init]; //retainCount:1 
self.xmlParser = [[NSXMLParser alloc] initWithData:self.xmlData]; 
[self.xmlParser setDelegate:self.parserDelegate]; //retainCount:2 
[self.xmlParser parse]; 
[self.xmlParser release]; 

ParserDelegate是委託類。

當然,如果我將'self'設置爲委託,我將沒有任何問題,但我想知道是否有辦法將不同的類用作委託而不泄漏。

預先感謝您。

回答

2

documentation上setDelegate:

「也就是新的委託對象它不保留的委託必須符合NSXMLParserDelegate協議協議」。

所以不用擔心。另外,即使它被保留了,一個合適的NSXMLParser類也會在'dealloc'中釋放委託。所以我認爲你沒有泄漏。

你崩潰的原因,是要重新分配的代表,因爲你帶給如果您有屬性parserDelegate設定爲retain,並保留計數下降到0

+0

所以我不應該擔心,即使它顯示爲儀器泄漏? 此外,由於我得到'setDelegate:'方法(根據儀器)後的retainCount:2,計數何時變爲0? – 2010-05-05 22:04:04

+0

這很奇怪,你得到第二個保留。如果您在上面的代碼中添加了該版本,或者添加了第二個版本以抵消2個保留計數,您會說它崩潰了嗎?如果是後者,這聽起來像是別的東西正在保留它。 – bobDevil 2010-05-06 05:31:47

+0

第一個。如果我在[self.xmlParser發佈]之後立即釋放它,它會崩潰。它可能是儀器工具中的一些錯誤嗎?我似乎無法理解'setDelegate'如何保留代表... – 2010-05-06 09:04:23

0

使用合成的方法(通過使用self )最初設置它,那麼這可能是你的泄漏。