我想通过 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 消息吗?
最佳答案
你不能这样做:
NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageSubmit)];
...或者这个:
MessageSubmit * messageSubmit = (MessageSubmit *) [data bytes];
一般来说,您不能只按原样发送对象在内存中的表示形式。例如,该类的 submitTile
实例变量是指向 NSString
对象的指针。当您通过网络发送数据时,您并不是在发送字符串本身,而是在发送指针——它只是发送设备上一 block 内存的内存地址。接收设备不会在任何地方存储相同的字符串,即使有,也不会有相同的内存地址。所以你有一个无意义的指针指向任何地方,你期望它指向一个不存在的字符串。
做您想做的事情的最简单方法是使您的 MessageSubmit
类 NSCoding
兼容。将其序列化为 NSData
而不是仅仅复制字节。
关于objective-c - 通过 Game Center 发送 NSString,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9621898/