iphone - NSXMLParser 接收错误 : [Parser conformsToProtocol:]: Message sent to deallocated instance 0xcd6be20

标签 iphone cocoa-touch nsxmlparser

当我弹出 NSXMLParser View Controller 并稍后返回时,我从 NSXMLParser 收到此错误。 2010-12-31 21:49:32.306 应用程序名称[12716:207] *** -[解析器符合协议(protocol):]:消息发送到已释放实例 0xcd6be20 :

这是我的代码:https://gist.github.com/761366

最佳答案

从您提供的代码片段中不可能准确说出发生了什么,但此错误通常意味着您已经过度释放了正在发送消息的对象。我对您的描述和代码的阅读是,解析器比您在此处设置为其委托(delegate)的对象的生命周期更长:

- (void)parseXMLFileAtURL:(NSString *)URL
{   
    stories = [[NSMutableArray alloc] init];
    NSURL *xmlURL = [NSURL URLWithString:URL];
    parser = [[NSXMLParser alloc] initWithContentsOfURL:xmlURL];
    [parser setDelegate:self];
    [parser setShouldProcessNamespaces:NO];
    [parser setShouldReportNamespacePrefixes:NO];
    [parser setShouldResolveExternalEntities:NO];
    [parser parse];

}

从您发布的代码片段中无法判断变量解析器的范围是什么。我怀疑它是一个全局变量,或者比委托(delegate)的生命周期更长。我怀疑这一点,因为我看到您将“self 对象”设置为委托(delegate),但从未取消设置它,并且错误消息是 informsToProtocol: 暗示这可能是问题所在,因为 NSXMLParser 无疑会调用在尝试调用任何委托(delegate)方法之前。当此对象消失时,它需要通过调用以下命令放弃其作为 NSXMLParser 实例的委托(delegate)的角色:

[parser setDelegate: nil];

如果解析器实际上是全局的或以其他方式共享,那么您还应该小心地在每次调用 parseXMLFileAtURL: 时重新创建它,而不释放先前的值。如果它是对象本身的 iVar,您仍然需要确保并清除委托(delegate),并在对象消失时(即在 dealloc 中)释放并清除 iVar。

但同样,根据您发布的代码片段无法确定。

关于iphone - NSXMLParser 接收错误 : [Parser conformsToProtocol:]: Message sent to deallocated instance 0xcd6be20,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4572524/

相关文章:

iphone - NSThread 在第二次调用时崩溃 (iPhone)

ios - 测试两个整数以确定现在是白天还是晚上

iphone - 如何从 NSXMLParserdelegate 方法返回 tableview 的行计数?

ios - 如何在 NSXMLParser 中将不同 URL 的解析数据保存到不同的数组中?

iphone - 执行将应用程序从 sleep 中唤醒的功能

iphone - 具有多个属性的 NSXMLParser

iphone - 如何对 CVImageBufferRef 视频帧进行操作

iphone - 在 ios 中以编程方式单击 UIImageView 上的事件

iOS 如何从框架启动 View Controller

ios - 子类 UITextField 默认在开头添加空格