【发布时间】:2011-07-23 00:09:48
【问题描述】:
我有一个想要通过蓝牙发送到另一台设备的对象。我已成功设置蓝牙连接并传输了编码的 NSString;但是,我还没有弄清楚如何正确使用归档和编码工具来发送对象。
我想发送下面定义的名为 ChatMessage 的对象。它实现了 NSCoding 委托方法 initWithCoder 和 encodeWithCoder,如下所示。
在第二个代码 sn-p 中,我有发送和接收数据的代码,即导致调用解码器的方法。
它一直在解码方法的最后一行崩溃。我一直在努力弄清楚出了什么问题。任何帮助将不胜感激!
@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];
}
【问题讨论】:
-
我想我刚刚回答了我自己的问题。我不知道为什么,但我有[数据发布];那是传递给接收数据函数的参数。我把它注释掉了。现在一切正常。
-
我还要指出,您应该在您的
-initWithCoder:方法中调用[super init]。 -
Alex,这是我在代码中拥有并删除的东西,因为 ChatMessage 是一个 NSObject,我的理解是这不是必需的。无论哪种方式都可以。如果它是一个如此基本的对象,为什么需要它?
标签: ios ios4 bluetooth nscoding