【问题标题】:App crashes when I try and release an object当我尝试释放对象时应用程序崩溃
【发布时间】:2011-01-27 16:48:05
【问题描述】:

我尽可能地简化了代码。并且仅包括应用程序按其需要运行所需的内容。

但我仍然遇到无法解释的崩溃。没有错误信息。它出现在我添加行 [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

如果我在没有调用“解析器”释放的情况下留下代码,那么它就可以完美运行。但显然这是内存泄漏。

【问题讨论】:

  • 不要将方法命名为“get*”,除非您正在获得 Cocoa/iOS 意义上的 get,而您在这里没有这样做。约定只是radioStationList

标签: iphone objective-c


【解决方案1】:

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

你应该避免释放两次或释放后赋值为nil。

【讨论】:

  • 是一个错字。很抱歉造成混乱
【解决方案2】:

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

【讨论】:

  • 打错字了!对此感到抱歉。
【解决方案3】:

您可以尝试通过使用检查对象上是否有分配内存

NSLog(@"parser allocation %d",[parser retainCount])

并尝试清空委托

[解析器 setDelegate:nil]

希望对你有帮助。

【讨论】:

    【解决方案4】:

    如果parser 是实例变量,则radioStationList 中注释掉的release 将是错误的。假设您希望解析器在 dealloc 之前一直存在,这不会是泄漏。

    如果 XMLParser 遵循标准的 delegate 模式,则它不会保留 parser,因此,release 可能会导致过度释放或稍后崩溃。

    如果你崩溃了,应该有一个回溯。或者崩溃日志。请张贴。另外,请尝试在启用 Zombies 的情况下运行,看看是否能获得更多信息。

    【讨论】:

    • 好的。谢谢你的那些点。从现在开始,我们可以请忽略这个错字吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2017-05-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-16
    相关资源
    最近更新 更多