# Propriétés et NSMutableArray



## Akard (30 Mars 2008)

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

```
@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

```
@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

```
@interface AllerVers : NSObject {
	NSString *action;
	NSPoint arrivee;
}

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

@end
```

Utilisation

```
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];
```


----------



## Eul Mulot (30 Mars 2008)

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 &#339;il à la gestion de la mémoire si tu n'est pas en 2.0, au niveau de ta couleur, un petit retain.


----------



## Akard (30 Mars 2008)

En rajoutant le retain à la couleur dans l'initialisation de l'agent, j'ai toujours le même problème.


----------



## Eul Mulot (30 Mars 2008)

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 ?


----------



## Akard (30 Mars 2008)

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.


----------



## tatouille (15 Avril 2008)

donne ton projet ca ira plus vite


----------



## Akard (21 Avril 2008)

Le voici.


----------



## tatouille (21 Avril 2008)

```
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];


----------



## Akard (22 Avril 2008)

Peux-tu m'expliquer un peu plus stp ?


----------



## Eul Mulot (24 Avril 2008)

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


----------



## eric210766 (25 Avril 2008)

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).


----------

