通过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。
做你想做的最简单的方法是让你的MessageSubmit
类NSCoding
compliant。 将其序列化成NSData
而不是仅仅复制字节。
尝试这个:
编码:
NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding];
您可以使用Game Center发送
解码:
NSString *recievedString = [NSString stringWithUTF8String:[recievedData bytes]];
编辑:现在我想你甚至可以把这个数据在你的消息结构之一,并做同样的[NSData dataWithBytes:&message length:sizeof(MessageSubmit)]
技巧,并发送它。