一条 Objective-C 消息被发送到地址 0x1 处已释放的“__NSDictionaryI”对象(僵尸)

Posted

技术标签:

【中文标题】一条 Objective-C 消息被发送到地址 0x1 处已释放的“__NSDictionaryI”对象(僵尸)【英文标题】:An Objective-C message was sent to a deallocated '__NSDictionaryI' object (zombie) at address 0x1 【发布时间】:2015-02-10 13:17:21 【问题描述】:

我有一个应用程序使用 Multipeer Connectivity 将字符串从一台 ios 设备发送到另一台 iOS 设备。它可以工作,也可以不工作。

该应用与此链接教程中的应用几乎相同:http://www.appcoda.com/intro-multipeer-connectivity-framework-ios-programming/

有时,应用会发送大约 30 条消息然后崩溃,有时,它会在第一条或第二条消息时崩溃。

Xcode 给了我一个 EXC_BAD_ACCESS 用于崩溃。

我使用 NSZombie 提供了一些帮助,它为我提供了以下信息,但我是新手,无法理解崩溃背后的原因。

如果崩溃是由于 NSDictionary 引起的,我的应用程序中只有 2 个:

-(void)session:(MCSession *)session peer:(MCPeerID *)peerID didChangeState:(MCSessionState)state
    NSDictionary *dict = @@"peerID": peerID,
                           @"state" : [NSNumber numberWithInt:state]
                           ;

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidChangeStateNotification"
                                                        object:nil
                                                      userInfo:dict];



-(void)session:(MCSession *)session didReceiveData:(NSData *)data fromPeer:(MCPeerID *)peerID
    NSDictionary *dict = @@"data": data,
                           @"peerID": peerID
                           ;

    [[NSNotificationCenter defaultCenter] postNotificationName:@"MCDidReceiveDataNotification"
                                                        object:nil
                                                      userInfo:dict];

有什么建议吗?

【问题讨论】:

你在某个地方有一个指向一个没有的对象的指针。毫无疑问,它曾经是,但后来它被“收集”了,因为问题指针不是“强”(或少数类似但更令人困惑的场景)。 要找出发生这种情况的位置,请了解如何获取和解释“异常堆栈跟踪”。 FWIW 您链接到的教程很差,您可能应该在其他地方寻找一个好的 MPC 示例。如果我找到一个,我会发布一个。 【参考方案1】:

僵尸通常会在您尝试访问任何已释放的对象时出现。

如果您使用的是 ARC,那么您不必太担心 Zombies,X 代码会为您解决,但在某些情况下,ARC 项目中也会出现僵尸。我从来没有遇到过这种问题。

如果您使用的是非 ARC 项目,则需要手动释放对象。

正如您的错误消息所暗示的,您使用了尚未分配或解除分配的字典对象,并且您正在尝试再次使用它。

如果您想查看僵尸在哪里,请单击警报消息后显示的箭头。您将被重定向到导致您的僵尸的线路。

请据此更新您的代码。

希望对你有所帮助。

【讨论】:

感谢您的回复,点击下一个箭头时,它显示“未知”,然后下一个箭头显示“终止”? 如果您使用 ARC,您肯定确实需要担心僵尸。 @HotLicks:就我目前为止的工作而言,僵尸从未出现在我的 ARC 项目中。我可能是错的,所以你能纠正吗?谢谢... @Manesh:请在您使用它的地方分配并初始化您的字典对象。 僵尸可能不太可能使用 ARC,但当它们发生时(它们会这样做),它们可能更难追踪。我还没有,所以不能告诉你产生它们的情况,但是这里有很多关于 ARC 应用程序中的僵尸报告。

以上是关于一条 Objective-C 消息被发送到地址 0x1 处已释放的“__NSDictionaryI”对象(僵尸)的主要内容,如果未能解决你的问题,请参考以下文章

一条 Objective-C 消息被发送到一个释放的 'UIActivityIndi​​catorView' 对象

第3章 类对象和方法(Objective-C程序设计)

nil 和释放对象的区别

将消息从 HTTP 端点发送到 JMS

iOS Cordova 应用程序在恢复时崩溃

Objective-C / 数组中的内存泄漏