我保持代码尽可能简单。并且仅包含应用程序实际需要的功能。
但我仍然遇到无法解释的崩溃。没有错误消息。它出现在我添加行[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
如果我在没有调用释放'解析器'的情况下离开代码,那么它的工作原理很完美。但显然这是一个内存泄漏。
答案 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]