一条 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”对象(僵尸)的主要内容,如果未能解决你的问题,请参考以下文章