2012-03-08 132 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甚至把這個數據放在你的消息結構中,並且執行相同的技巧併發送它。