将Objective-C消息发送给已解除分配的“_ NSDictionaryI'对象(僵尸)在地址0x1

时间:2015-02-10 13:17:21

标签: ios objective-c xcode nsdictionary multipeer-connectivity

我有一个使用Multipeer Connectivity的应用程序,可以将一个字符串从一个iOS设备发送到另一个iOS设备。它有效且无效。

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

有时候,应用会发送大约30条消息然后崩溃,有时候,它会在第1条或第2条消息上崩溃。

Xcode正在为我提供EXC_BAD_ACCESS崩溃。

我使用NSZombie提供了一些帮助,它为我提供了以下内容,但我相当新,无法理解崩溃背后的原因。

ScreenShot of 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];
}

有什么建议吗?

1 个答案:

答案 0 :(得分:-1)

当您尝试访问任何已解除分配的对象时,通常会出现僵尸。

如果您正在使用ARC,那么您不必担心僵尸,X代码会为您做到这一点,但在某些情况下僵尸也会进入ARC项目。我从未遇到过这种问题。

如果您使用的是非ARC项目,则需要手动取消分配对象。

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

如果您想查看僵尸的位置,请点击警告信息后显示的箭头。您将被重定向到导致您的僵尸的线路。

请根据此更新您的代码。

希望这会对你有所帮助。