使用NSXMLParser接收错误:[Parser conformsToProtocol:]:发送到解除分配的实例0xcd6be20的消息

时间:2010-12-31 22:12:50

标签: iphone cocoa-touch nsxmlparser

当我弹出NSXMLParser视图控制器时,我从NSXMLParser收到此错误,然后再回到它。 2010-12-31 21:49:32.306 App Name[12716:207] *** -[Parser conformsToProtocol:]: message sent to deallocated instance 0xcd6be20 :

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

2 个答案:

答案 0 :(得分:3)

不可能从你提供的片段中确切地说出正在发生的事情,但是这个错误通常意味着你已经过度释放了被消息的对象。我对你的描述和你的代码的解读是,解析器比你在这里设置为委托的对象更长寿命:

- (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];

}

从您发布的变量解析器的范围是不可能的。我怀疑它是一个全局变量,或者比委托更长寿。我怀疑这一点,因为我看到你将'自我对象'设置为委托,但从未取消它,并且错误消息是conformsToProtocol的事实:暗示这可能是问题,因为NSXMLParser无疑会调用在尝试调用任何委托方法之前。当这个对象消失时,它需要通过调用它来放弃它作为NSXMLParser实例的委托的角色:

[parser setDelegate: nil];

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

但同样,根据你发布的片段,我们无法确定。

答案 1 :(得分:0)

这是您多次释放对象时会收到的消息。我看到你有一个自定义自动释放池设置,这可能是罪魁祸首,但你可能已经得到了,因为你正在运行多个线程。看起来你的tableViewController有一个名为parser的实例变量,如果你已经将它声明为属性,你可能想要检查它是否设置为retain。如果没有看到完整的头部声明和实现,很难准确说明发布的确切位置。

我通常处理这些错误的方法是在Xcode中启用NSZombie跟踪。这将在引用解除分配的对象时为您提供堆栈跟踪,并允许您在xcode调试器中查看您的应用程序状态。

这是一个链接,其中包含有关配置Xcode以启用NSZombies的说明。 http://www.cocoadev.com/index.pl?NSZombieEnabled