Я пытаюсь отправить сообщение с игровым центром, которое содержит структуру, примерно следуя руководству Рея Рэя Вендерлиха. В общем, отправка и получение сообщений не было проблемой, но когда я что-то добавляю с указателем, я немного запутался. Цель состоит в том, чтобы отправить несколько строк и BOOL как одно сообщение. Соответствующий код следует:
//myfile.h
typedef enum {
kMessageTypeRandomNumber = 0,
kMessageTypeInterstitial
} MessageType;
typedef struct {
MessageType messageType;
} Message;
typedef struct {
Message message;
char *playerName;
char *scores;
BOOL correct;
char *stat;
} MessageInterstitial;
//myfile.m
- (void)sendData:(NSData *)data {
NSError *error;
BOOL success = [[GCHelper sharedInstance].match sendDataToAllPlayers:data withDataMode:GKMatchSendDataReliable error:&error];
if (!success) {
NSLog(@"Error sending init packet:\n%@",error);
}
}
-(void)send{
MessageInterstitial message;
message.message.messageType = kMessageTypeInterstitial;
message.playerName="test";
NSData *data = [NSData dataWithBytes:&message length:sizeof(MessageInterstitial)];
[self sendData:data];
MessageInterstitial * myMessage = (MessageInterstitial *) [data bytes];
printf("player: %s\n",myMessage->playerName); // prints 'player: test' as expected
}
- (void)match:(GKMatch *)match didReceiveData:(NSData *)data fromPlayer:(NSString *)playerID {
Message *message = (Message *) [data bytes];
if(message->messageType == kMessageTypeInterstitial)
{
MessageInterstitial * myMessage = (MessageInterstitial *) [data bytes];
printf("player: %s\n",myMessage->playerName); //prints 'player: ' not expected
}
}
Похоже, что данные сохраняются правильно, так как я могу распечатать их сразу же без проблем, но я думаю, что данные указывают на адрес в памяти, что делает его таким, чтобы он печатал правильная вещь на отправляющем устройстве, но не на принимающем устройстве. При этом я понятия не имею, как это исправить или как мне следует отправлять строки в структуре, если это действительно так.