NSXMLParser的委托和内存泄漏
问题描述:
我在我的程序中使用了一个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'设置为委托,我将没有任何问题,但我想知道是否有办法将不同的类用作委托而不泄漏。
预先感谢您。
答
从documentation上setDelegate:
“也就是新的委托对象它不保留的委托必须符合NSXMLParserDelegate协议协议”。
所以不用担心。另外,即使它被保留了,一个合适的NSXMLParser类也会在'dealloc'中释放委托。所以我认为你没有泄漏。
你崩溃的原因,是要重新分配的代表,因为你带给如果您有属性parserDelegate
设定为retain
,并保留计数下降到0
答
使用合成的方法(通过使用self
)最初设置它,那么这可能是你的泄漏。
所以我不应该担心,即使它显示为仪器泄漏? 此外,由于我得到'setDelegate:'方法(根据仪器)后的retainCount:2,计数何时变为0? – 2010-05-05 22:04:04
这很奇怪,你得到第二个保留。如果您在上面的代码中添加了该版本,或者添加了第二个版本以抵消2个保留计数,您会说它崩溃了吗?如果是后者,这听起来像是别的东西正在保留它。 – bobDevil 2010-05-06 05:31:47
第一个。如果我在[self.xmlParser发布]之后立即释放它,它会崩溃。它可能是仪器工具中的一些错误吗?我似乎无法理解'setDelegate'如何保留代表... – 2010-05-06 09:04:23