objective-c - 通过 Game Center 发送 NSString

标签 objective-c ios cocos2d-iphone game-center

我想通过 Gamecenter 将 NSString 从另一个发送到另一个 iPhone/iPad 但它因 EXC_BAD_ACCESS 而崩溃

这里是.h文件

typedef enum {
    kMessageTypeRandomNumber = 0,
    kMessageTypeGameBegin,
    kMessageTypeSubmit,
    kMessageTypeExchange,
    kMessageTypePickup,
    kMessageTypePass,
    kMessageTypeGameOver
} MessageType;

typedef struct {
    MessageType messageType;
} Message;

typedef struct {
Message message;
NSString *submitTile;
} MessageSubmit;

这里是.m文件

- (void)sendData:(NSData *)data {
    NSError *error;
    BOOL success = [[GCHelper sharedInstance].match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];
    if (!success) {
        CCLOG(@"Error sending init packet");
        [self matchEnded];
    }
}
-(void)sendSubmit:(NSString *) submitTile {
    MessageSubmit message;
    message.message.messageType = kMessageTypeSubmit;
    message.submitTile = submitTile;
    NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageSubmit)];    
    [self sendData:data];
}

如果我点击 CCMenu 图片,它会调用 onSubmit 函数 这里是 onSubmit 函数

-(void)onSubmit
{
    NSString *submitStr = @"1-7-7 =-7-8 1-7-9";

    [self sendSubmit:submitStr];
}

最后一个是didReceiveData方法

- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
    if (message->messageType == kMessageTypeSubmit) {
        MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];
        NSString *submitStr = messageSubmit->submitTile;

        NSLog(@"SubTile %@",submitStr);
    }
}

它在行 NSString *submitStr = messageSubmit->submitTile; 上有 EXC_BAD_ACCESS。

有什么方法可以通过 iPhone/iPad 发送 NSString 消息吗?

最佳答案

你不能这样做:

NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageSubmit)];    

...或者这个:

MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];

一般来说,您不能只按原样发送对象在内存中的表示形式。例如,该类的 submitTile 实例变量是指向 NSString 对象的指针。当您通过网络发送数据时,您并不是在发送字符串本身,而是在发送指针——它只是发送设备上一 block 内存的内存地址。接收设备不会在任何地方存储相同的字符串,即使有,也不会有相同的内存地址。所以你有一个无意义的指针指向任何地方,你期望它指向一个不存在的字符串。

做您想做的事情的最简单方法是使您的 MessageSubmitNSCoding 兼容。将其序列化为 NSData 而不是仅仅复制字节。

关于objective-c - 通过 Game Center 发送 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621898/

相关文章:

ios - FMDB stringforcolumn 为 nil

iphone - 使用 cocos2d 应用程序降低功耗的可能性

cocos2d-iphone - 使用 cocos 2D 生成动画 Sprite 表的任何工具

objective-c - 用opengl绘制少于每一帧

ios - 在应用程序 IOS Objective C 启动时添加新的 View Controller

已安装 iOS8 自签名证书但仍不受信任

ios - 我的应用程序在 iOS 模拟器中不显示任何内容

iphone - 更改 MGTwitterEngine 的委托(delegate)

ios - SKShapeNode 位置和 touch.location 的区别

cocos2d-iphone - 多个声音同时播放时音效中途停止?