2011-07-23 57 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

---代碼是崩潰,因爲我有

[數據釋放];

我發現這使用儀器工具。