Sérialisation et NSNumber

Bladrak

Membre actif
24 Mars 2004
600
78
36
Vincennes
Bonjour à tous,

Je suis en train de développer un jeu pour iPhone en bluetooth, et pour ce faire je dois envoyer des paquets de données pour échanger entre les deux appareils. Pour ce faire, j'envoie une instance de la classe Data, je passe donc par la sérialisation pour envoyer mes objets.

Pour simplifier un peu mon code, j'ai créé une classe Packet qui contient un int (un enum) avec le code du paquet (pour identifier le type d'instruction envoyée) puis un objet qui implémente le protocole NSCoding mais qui peut être d'un type différent. Dans la classe Packet il est donc identifié par un NSObject (et je soupçonne que le problème vienne de là).

Cet objet peut être de type NSNumber ou de type Move (une autre classe créée qui implémente NSCoding).

Un peu de code pour expliciter le tout :

Bloc de code:
#import <Foundation/Foundation.h>


@interface Packet : NSObject <NSCoding> {
	packetCodes code;
	NSObject *object;
}

@property (nonatomic, retain) NSObject *object;
@property (nonatomic) packetCodes code;

@end

packetCodes est un enum tout simple (donc un int)

Code incriminé (un peu crado, j'ai testé différentes choses)
Bloc de code:
-(void)receivedDatas:(NSData *) data fromPeer:(NSString *)peer inSession:(GKSession *)session context:(void *)context {
	
	Packet *packet = [NSKeyedUnarchiver unarchiveObjectWithData:data];

	switch( packet.code ) {
		case NETWORK_COINTOSS:
		{
			// coin toss to determine roles of the two players
			NSNumber *cT = (NSNumber *)packet.object;
			int coinToss = [cT intValue]; 
			// if other player's coin is higher than ours then that player is the server
			if(coinToss > gameUniqueID) {
				self.peerStatus = kClient;
			}

Ça plante sur le [cT intValue] et quand je débugge je vois que cT n'a pas de valeur (elle est "out of scope") malgré qu'il soit bien alloué. L'erreur est un EXC_BAD_ACCESS.

La méthode pour envoyer les données :
Bloc de code:
-(void)sendDataToPeer:(NSObject *)data packetId:(int)packetId{
	Packet *pkt = [[Packet alloc] init];
	pkt.code=packetId;
	pkt.object=data;
	NSData *packet = [NSKeyedArchiver archivedDataWithRootObject:pkt];
	[btComm mySendDataToPeers:packet];
}

Quelqu'un aurait des idées ? J'aurais intérêt à sous-classer Packet pour deux types différents ?

Merci d'avance.

---------- Nouveau message ajouté à 09h44 ---------- Le message précédent a été envoyé à 09h35 ----------

Bon, après un examen un peu mieux réveillé du code le soucis vient probablement du fait que je ne faisais pas de retain sur l'object dans mon initWithCoder.

Je vous confirme dès que j'ai le deuxième device pour tester.

Si c'est ça j'irai me pendre avec mes conneries de gestion de la mémoire en objective-C :p