0
我有一個對象,我想通過藍牙發送到另一個設備。我已經成功設置了藍牙連接並傳輸了一個編碼的NSString;但是,我還沒有想出如何正確使用存檔和編碼工具來發送對象。解碼器通過藍牙連接崩潰
我想發送下面定義的名爲ChatMessage的對象。它實現NSCoding委託方法initWithCoder和encodeWithCoder,如下所示。
在第二個代碼片段中,我有發送和接收數據的代碼,即導致解碼器被調用的方法。
它在解碼方法的最後一行不斷崩潰。我一直在努力弄清楚哪裏出了問題。任何幫助將不勝感激!
@interface ChatMessage : NSObject <NSCoding> {
NSString *sender;
NSString *message;
}
@property (nonatomic, retain) NSString *sender;
@property (nonatomic, retain) NSString *message;
@end
- (void)encodeWithCoder:(NSCoder *)coder {
[coder encodeObject:sender forKey:@"sender"];
[coder encodeObject:message forKey:@"message"];
}
- (id)initWithCoder:(NSCoder *)coder {
sender = [[coder decodeObjectForKey:@"sender"] retain];
message = [[coder decodeObjectForKey:@"message"] retain];
return self;
}
在我的視圖中,PeerPicker委託函數的協議。
- (void) receiveData:(NSData *)data
fromPeer:(NSString *)peer
inSession:(GKSession *)session
context:(void *)context {
ChatMessage *aMsg = [[ChatMessage alloc] init];
NSKeyedUnarchiver *unarchiver = [[NSKeyedUnarchiver alloc]
initForReadingWithData:data];
@try {
aMsg = [unarchiver decodeObjectForKey:@"myMessage"];
}
@catch (NSException *exception) {
NSLog(@"Error: %@", exception);
}
@finally {
}
if (!messages) messages = [[NSMutableArray alloc] init];
[messages addObject:aMsg];
// reload the table
[messageList reloadData];
[unarchiver finishDecoding];
[unarchiver release];
[data release];
}
我想我只是回答了我自己的問題。我不知道爲什麼,但我有[數據發佈];這是一個傳遞給接收數據函數的參數。我評論說。現在一切正常。 – vesselhead
我也會指出你應該在'-initWithCoder:'方法中調用'[super init]'。 –
亞歷克斯,這是我已經在代碼中刪除,因爲ChatMessage是一個NSObject,我的理解是,這不是必需的。它以任何方式工作。如果它是這樣一個基本對象,爲什麼需要它? – vesselhead