2012-03-08 78 views
0

我想送的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消息?

回答

1

你不能做到这一点:

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

...或这个:

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

一般来说,你不能只是发送对象的内存中表示原样左右是。例如,该类的submitTile实例变量是指向NSString对象的指针。当您通过网络发送数据时,您并不是自己发送字符串,而是发送指针 - 这只是发送设备上一块内存的内存地址。接收设备将不会在任何地方存储相同的字符串,即使它具有相同的内存地址也不会有相同的内存地址。所以你有一个无意义的指针指向无处,并且你期望它指向一个不存在的字符串。

做你想做的最简单的方法就是让你的MessageSubmitNSCoding兼容。将它序列化为NSData而不是仅仅复制字节。

+0

你能举出一个使用NSCoding和NSData的例子,你说的是thx – 2012-03-08 17:41:43

+1

阅读文档,尝试自己做,如果你失败了,发表另一个问题,解释你尝试过的以及失败的地方。 – Jim 2012-03-08 18:41:40

+1

“rtfm”是回答某人的不好方法(在所有地方的stackoverflow上)。 Downvoted。 – Jonny 2013-05-03 13:44:36

1

试试这个:

为了编码:

NSData *data = [stringToEncode dataUsingEncoding:NSUTF8Encoding]; 

,你可以使用游戏中心发送

为了解码:

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

编辑:现在我认为你c甚至把这个数据放在你的消息结构中,并且执行相同的技巧并发送它。