Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Objective c 通过游戏中心发送NSString_Objective C_Ios_Cocos2d Iphone_Game Center - Fatal编程技术网

Objective c 通过游戏中心发送NSString

Objective c 通过游戏中心发送NSString,objective-c,ios,cocos2d-iphone,game-center,Objective C,Ios,Cocos2d Iphone,Game Center,我想通过Gamecenter将NSString从另一个发送到另一个iPhone/iPad 但它会因为EXC\u坏访问而崩溃 这里是.h文件 typedef enum { kMessageTypeRandomNumber = 0, kMessageTypeGameBegin, kMessageTypeSubmit, kMessageTypeExchange, kMessageTypePickup, kMessageTypePass, kMes

我想通过Gamecenter将NSString从另一个发送到另一个iPhone/iPad 但它会因为EXC\u坏访问而崩溃

这里是.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->submitile行上具有EXC\u BAD\u访问权限

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

您不能这样做:

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

MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];
一般来说,不能只按原样发送对象的内存表示。例如,该类的
submitile
实例变量是指向
NSString
对象的指针。当您通过网络发送数据时,您发送的不是字符串本身,而是指针——它只是发送设备上一块内存的内存地址。接收设备不会在任何地方存储相同的字符串,即使它存储了相同的内存地址,也不会有相同的内存地址。所以你有一个无意义的指针指向任何地方,你希望它指向一个不存在的字符串

做你想做的事情的最简单的方法是使你的
MessageSubmit
class
NSCoding
-兼容。将其序列化为
NSData
,而不仅仅是复制字节。

尝试以下操作:

编码:

NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding];
您可以使用游戏中心发送

要解码:

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

编辑:现在我想你甚至可以把这些数据放在你的一个消息结构中,然后做同样的
[NSData dataWithBytes:&messagelength:sizeof(MessageSubmit)]
技巧并发送它。

你能举一个使用NSCoding和NSData的例子吗?你可以说阅读文档,尝试自己做,如果失败,发布另一个问题,解释您尝试了什么以及失败的地方。“rtfm”是回答某人的一种糟糕的方式(在所有地方)。被否决。