Propriétés et NSMutableArray

Akard

Membre enregistré
30 Mars 2008
6
1
Bonjour,

Je suis assez nouveau en Objective-C et j'ai quelques problèmes concernant les NSMutableArray.

J'ai une classe agent qui définit deux propriétés NSMutableArray que j'initialise dans le constructeur de la classe. Mon problème vient du fait que lorsque récupère l'instance de mon agent, le débugger me dit que mes NSMutableArray sont des NSObjects et il n'arrive pas à m'afficher le nombre d'objets contenus dedans.
De plus lorsque j'ajoute un objet au tableau, il ne me l'insère pas.

Qu'est-ce qu'il ne va pas ?

Je vous joins mon code.

Agent.h
Bloc de code:
@interface Agent : NSObject {
	//Déclaration des attributs
	Etat *etat;
	NSColor *couleur;
	bool estVivant;
	bool estEnPause;
	NSThread *thread;
	NSMutableArray *actionsConnues;
	NSMutableArray *actionsEnCours;
}

//Définition des propriétés
@property(retain, readonly) NSColor *couleur;
@property(retain, readonly) NSThread *thread;
@property(assign, readwrite) bool estVivant;
@property(assign, readwrite) bool estEnPause;
@property(retain, readwrite) NSMutableArray *actionsConnues;
@property(retain, readwrite) NSMutableArray *actionsEnCours;

//Définition des méthodes
- initWithColor:(NSColor *)color;

Agent.m
Bloc de code:
@implementation Agent

// Création des getter/setter des propriétés
@synthesize etat;
@synthesize couleur;
@synthesize thread;
@synthesize estVivant;
@synthesize estEnPause;
@synthesize actionsConnues;
@synthesize actionsEnCours;

- (void)Vie
{
}

- (id)init
{
	return [self initWithColor:[NSColor blackColor]];
}

- (id)initWithColor: (NSColor *)color
{
	self = [super init];
	if (self) {
		//Positionnement de la couleur
		couleur = color;
		etat = [[Etat alloc] init];
		//Faire Vivre l'agent
		estVivant = YES;
		estEnPause = YES;
		//Création de la liste des actions connues
		actionsConnues = [[NSMutableArray alloc] init];
		//Création de la liste des actions en cours
		actionsEnCours = [[NSMutableArray alloc] init];	
		//Création du Thread
		thread = [[NSThread alloc] initWithTarget:self selector:@selector(Vie) object:nil];
		[thread start];
	}
	return self;
}
@end

AllerVers.h
Bloc de code:
@interface AllerVers : NSObject {
	NSString *action;
	NSPoint arrivee;
}

@property(retain, readwrite) NSString *action;
@property(assign, readwrite) NSPoint arrivee;

@end

Utilisation
Bloc de code:
	Agent *agent = [[Agent alloc] initWithColor:[NSColor redColor]];
	agent.etat.position = NSMakePoint(10, 10);
	
	AllerVers *action = [[AllerVers alloc] init];
	action.arrivee = NSMakePoint(40, 50);
	action.action = @"AllerVers(40,50)";
	[agent.actionsConnues addObject:action];
 
Comme ça je ne peux pas te dire ce qui ne vas pas, ça fait un an que j'ai pas trop touché à l'Obj-C et je débutais. Par contre il faudrait peut être que tu jettes un œil à la gestion de la mémoire si tu n'est pas en 2.0, au niveau de ta couleur, un petit retain.
 
En rajoutant le retain à la couleur dans l'initialisation de l'agent, j'ai toujours le même problème.
 
Oui oui ton erreur ne venait pas de là, d'ailleurs je viens de calculer que tu étais en 2.0, les synthetize ne me disait rien du tout ! Donc dans ce cas le retain n'est pas nécessaire. Je n'ai pas touché à l'Objc-C 2.0, sinon je ne vois pas trop d'où peut venir ton problème.

Gcc t'insulte dès l'instanciation de ton Agent ?
 
Non gcc ne me dit rien du tout. C'est juste que rien ne se passe. Après l'ajout de l'action dans le tableau, il reste désespérément vide.
 
Bloc de code:
2008-04-21 10:40:59.477 Alive[391:10b] *** _NSAutoreleaseNoPool(): Object 0x1096d0 of class NSCFArray autoreleased with no pool in place - just leaking
Stack: (0x9702012f 0x96f2cec2 0x3639 0x2d98)
2008-04-21 10:40:59.478 Alive[391:10b] *** _NSAutoreleaseNoPool(): Object 0x10c230 of class NSCFArray autoreleased with no pool in place - just leaking
Stack: (0x9702012f 0x96f2cec2 0x25e8 0x2ec3)
2008-04-21 10:40:59.480 Alive[391:10b] *** _NSAutoreleaseNoPool(): Object 0x10c030 of class Etat autoreleased with no pool in place - just leaking
Stack: (0x9702012f 0x96f2cec2 0x271d 0x2ef7)
2008-04-21 10:40:59.480 Alive[391:10b] *** _NSAutoreleaseNoPool(): Object 0x1096d0 of class NSCFArray autoreleased with no pool in place - just leaking
Stack: (0x9702012f 0x96f2cec2 0x3639 0x2f63)
2008-04-21 10:40:59.481 Alive[391:10b] *** _NSAutoreleaseNoPool(): Object 0x10c850 of class Etat autoreleased with no pool in place - just leaking
Stack: (0x9702012f 0x96f2cec2 0x271d 0x301e)
2008-04-21 10:40:59.482 Alive[391:10b] *** _NSAutoreleaseNoPool(): Object 0x1096d0 of class NSCFArray autoreleased with no pool in place - just leaking
deja 1, je reviendrai

id POOL = [[NSAutoreleasePool alloc] init];
/// your code

[POOL release];
 
L'autorelease pool "collecte" les objets que tu instancies, c'est elle qui gère la mémoire si tu préfère. Les objets en autorealse ont besoin d'être instanciés dans l'autorelease pool.

Plus d'infos dans la doc très complète !
Memory Management
 
L'autoreleasepool est en fait un objet qui collecte les objets qui sont instanciés selon les deux approches suivantes:

1°) Lorsque autorelease est formulée:

anObject = [[[NSClass alloc] initX:] autorelease];

2°) Lorsque l'instance est construite à l'aide d'une méthode de classe:

anObject = [NSClass méthode];

Ces objets sont placés dans le pool principal, c'est à dire celui qui est associé à l'application en cours (NSApp).

D'autre part, ces objets recoivent automatiquement le message release après l'exécution du dernier événement de l'interface visuelle (mouseDown, etc.)

Par ailleurs, lorsque l'on utilise un thread, il est de la responsabilité du programmeur de gérer cet autorelease (construction et destruction).