2011-07-23 54 views
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]; 


} 
+1

我想我只是回答了我自己的问题。我不知道为什么,但我有[数据发布];这是一个传递给接收数据函数的参数。我评论说。现在一切正常。 – vesselhead

+0

我也会指出你应该在'-initWithCoder:'方法中调用'[super init]'。 –

+0

亚历克斯,这是我已经在代码中删除,因为ChatMessage是一个NSObject,我的理解是,这不是必需的。它以任何方式工作。如果它是这样一个基本对象,为什么需要它? – vesselhead

回答

0

---代码是崩溃,因为我有

[数据释放];

我发现这使用仪器工具。