通过游戏中心发送NSString

时间:2012-03-08 17:17:28

标签: 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消息?

2 个答案:

答案 0 :(得分:1)

你不能这样做:

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

......或者这个:

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

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

执行您要执行的操作的最简单方法是使MessageSubmitNSCoding符合要求。将其序列化为NSData而不是仅仅复制字节。

答案 1 :(得分:1)

试试这个:

编码:

NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding];

您可以使用Game Center发送

解码:

NSString *recievedString = [NSString stringWithUTF8String:[recievedData bytes]];

编辑 现在我认为您甚至可以将这些数据放入一个消息结构中并执行相同的[NSData dataWithBytes:&message length:sizeof(MessageSubmit)]技巧并发送它。