我对那些抱怨xmlParser泄漏的乐器感到困惑。 它是一个分配和释放的本地对象。似乎没有任何花哨的东西,我可以看到它可能导致它泄漏。
#import "WebServiceAPI.h"
#import "XMLParser.h"
@implementation WebServiceAPI
-(void) getRadioStationList//:(id) aDelegate;
{
NSData *xml = [NSData dataWithContentsOfURL: [NSURL
URLWithString:@"http://radio.com/Fradio/Radios.xml"]];
NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithData:xml];
parser = [[XMLParser alloc] initXMLParser];
[xmlParser setDelegate:parser];
[xmlParser parse];
[xmlParser setDelegate:nil];
[xmlParser release];
}
- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
}
- (void) connection:(NSURLConnection*) connection didFailWithError:(NSError*) error
{
//NSLog(@" Connection for radiolist failed ");
}
-(void) dealloc
{
parser = nil;
[parser release];
[super dealloc];
}
@end
如果有任何用途,这是堆栈跟踪。
5 Footy Radio 48 Bytes -[WebServiceAPI getRadioStationList]
4 CoreFoundation 48 Bytes +[NSObject(NSObject) alloc]
3 CoreFoundation 48 Bytes +[NSObject(NSObject) allocWithZone:]
2 libobjc.A.dylib 48 Bytes class_createInstance
1 libobjc.A.dylib 48 Bytes _internal_class_createInstanceFromZone
0 libSystem.B.dylib 48 Bytes calloc
有人可以解释一下可能出现的问题吗?
答案 0 :(得分:4)
首先,getRadioStationList
应为radioStationList
; get*
在iOS中有一个非常特别的含义,而不是它。
其次,这没有任何意义:
parser = nil;
[parser release];
第二行代码什么都不做,因此,parser
将被泄露。
答案 1 :(得分:0)
如果调用getRadioStationList
而不是dealloc,则可能会泄漏parser
,因为parser
会被新分配的数据覆盖。
答案 2 :(得分:0)
首先,从您的问题来看,问题出在xmlParser上吗?
虽然仪器显示xmlParser的泄漏,但泄漏实际上是在其他解析器方法中,即。 didStartElement,didEndElement等。
其次,你不应该设置nil然后释放,因为你发布的只是'nil'。删除该行。
第三,关于解析器,这里有一个引用计数问题。解析器是一个委托,因此当xmlParser准备调用它时将使用它。在上面的代码中释放解析器后,可能会发生这种情况,从而导致崩溃。您可能需要做的是将解析器保留在parserDidStartDocument中并在parserDidEndDocument中释放它。
您也可能过早发布WebServiceAPI,导致dealloc过早发生。重要的是要注意,只有在完成对象时才应该释放,并且应该保留一个您想要使用的对象,特别是如果您知道它可能被其他进程释放。