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 )最初设置它,那么这可能是你的泄漏。