当我尝试释放一个对象时,应用程序崩溃了

时间:2011-01-27 16:48:06

标签: iphone objective-c

我保持代码尽可能简单。并且仅包含应用程序实际需要的功能。

但我仍然遇到无法解释的崩溃。没有错误消息。它出现在我添加行[parser release];

作为XMLParser对象的解析器在我发布时崩溃,即使它是本地分配和释放的,或者如果我使它成为成员变量并在dealloc方法中释放,也会发生。

以下是其使用的小类的代码。

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class WebServiceAPI, RadioAppDelegate, XMLParser;
@interface WebServiceAPI : NSObject
{   
    XMLParser *parser;
    FootballRadioAppDelegate *appDelegate;
}
@end


#import "WebServiceAPI.h"
#import "XMLParser.h"

@implementation WebServiceAPI

-(void) getRadioStationList//:(id) aDelegate;
{
    NSURL *url = [[NSURL alloc] initWithString:@"http://bdoyle.kingpinhosting.com/Radios.xml"];
    NSXMLParser *xmlParser = [[NSXMLParser alloc] initWithContentsOfURL:url];
    [url release];
    parser = [[XMLParser alloc] initXMLParser];
    [xmlParser setDelegate:parser];
    [xmlParser parse];

    [xmlParser release];
    xmlParser = nil;    
}
- (void) connectionDidFinishLoading:(NSURLConnection*)connection
{
}   

- (void) connection:(NSURLConnection*) connection didFailWithError:(NSError*) error
{
}   

-(void) dealloc
{
    [parser release];
    parser = nil;
    [super dealloc];
}
@end

如果我在没有调用释放'解析器'的情况下离开代码,那么它的工作原理很完美。但显然这是一个内存泄漏。

4 个答案:

答案 0 :(得分:1)

您正在“getRadioStationList”方法上释放解析器,而不是将其分配给nil。然后在课程的dealloc上再次释放它。

释放后应避免释放两次或指定为nil。

答案 1 :(得分:1)

看起来你正在释放解析器两次;一次在dealloc中,一次在getRadioStationList中。

答案 2 :(得分:0)

如果parser是实例变量,则release中注释掉的radioStationList会出错。假设您希望解析器在dealloc之前存活,那就不会出现泄漏。

如果XMLParser遵循标准delegate模式,那么它将不会保留parser,因此,release可能会导致过度释放或以后崩溃。< / p>

如果你正在崩溃,应该有一个回溯。或崩溃日志。请发布它。另外,尝试在启用僵尸的情况下运行,看看你是否获得了更多信息。

答案 3 :(得分:0)

您可以尝试使用

检查对象上是否有分配内存
  

NSLog(@“解析器分配%d”,[解析器retainCount])

并尝试清空代理

  

[parser setDelegate:nil]

希望它有所帮助。