仪器抱怨泄漏,但物体明显分配和解除分配

时间:2011-04-04 23:53:36

标签: iphone objective-c

我对那些抱怨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

有人可以解释一下可能出现的问题吗?

3 个答案:

答案 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过早发生。重要的是要注意,只有在完成对象时才应该释放,并且应该保留一个您想要使用的对象,特别是如果您知道它可能被其他进程释放。