私は、Bluetoothを介して別のデバイスに送信したいオブジェクトを持っています。私は正常にBluetooth接続をセットアップし、コード化されたNSStringを転送しました。しかし、私はオブジェクトを送信するためにアーカイブとエンコーディングのツールを正しく使用する方法を理解していません。デコーダがBluetooth接続を介してクラッシュする
ChatMessageという下記のオブジェクトを送信したいとします。以下に示すように、NSCodingデリゲートメソッドinitWithCoderとencodeWithCoderを実装しています。
2番目のコードスニペットでは、データを送受信するためのコード、つまりデエンコーダが呼び出されるメソッドがあります。
デコードメソッドの最後の行でクラッシュし続けます。私は間違っていることを理解するために苦労してきました。どんな助けでも大歓迎です!
@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 Delegate機能のプロトコルです。
- (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なので、コードで削除したことがあるAlexですが、これは必須ではないということでした。どちらの方法でも動作します。なぜそれがそのような基本的な目的ならば必要なのかについての洞察はありますか? – vesselhead