通过游戏中心
问题描述:
我想送的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图像,它会调用的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);
}
}
它有EXC_BAD_ACCESS上线NSString *submitStr = messageSubmit->submitTile;
。
有没有办法通过iPhone/iPad发送NSString消息?
答
你不能做到这一点:
NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageSubmit)];
...或这个:
MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];
一般来说,你不能只是发送对象的内存中表示原样左右是。例如,该类的submitTile
实例变量是指向NSString
对象的指针。当您通过网络发送数据时,您并不是自己发送字符串,而是发送指针 - 这只是发送设备上一块内存的内存地址。接收设备将不会在任何地方存储相同的字符串,即使它具有相同的内存地址也不会有相同的内存地址。所以你有一个无意义的指针指向无处,并且你期望它指向一个不存在的字符串。
做你想做的最简单的方法就是让你的MessageSubmit
类NSCoding
兼容。将它序列化为NSData
而不是仅仅复制字节。
答
试试这个:
为了编码:
NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding];
,你可以使用游戏中心发送
为了解码:
NSString *recievedString = [NSString stringWithUTF8String:[recievedData bytes]];
编辑:现在我认为你c甚至把这个数据放在你的消息结构中,并且执行相同的技巧并发送它。
你能举出一个使用NSCoding和NSData的例子,你说的是thx – 2012-03-08 17:41:43
阅读文档,尝试自己做,如果你失败了,发表另一个问题,解释你尝试过的以及失败的地方。 – Jim 2012-03-08 18:41:40
“rtfm”是回答某人的不好方法(在所有地方的*上)。 Downvoted。 – Jonny 2013-05-03 13:44:36