通过Game Center发送NSString

我想通过Gamecenter发送另一个到另一个iPhone / iPad的NSString,但它与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图像,它会调用提交function,这里是onSubmitfunction

 -(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); } } 

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

有没有办法通过iPhone / iPad发送NSString消息?

你不能这样做:

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

…或这个:

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

一般来说,你不能只按原样发送对象的内存表示。 例如, submitTile实例variables是一个指向NSString对象的指针。 当您通过networking发送数据时,您不会发送string本身,您正在发送指针 – 这只是发送设备上一块内存的内存地址。 接收设备不会在任何地方存储相同的string,即使这样做也不会有相同的内存地址。 所以你有一个无意义的指针指向无处,你期待它指向一个不存在的string。

做你想做的最简单的方法是让你的MessageSubmitNSCoding compliant。 将其序列化成NSData而不是仅仅复制字节。

尝试这个:

编码:

 NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding]; 

您可以使用Game Center发送

解码:

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

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