savoir si un NSArray a déjà été alloué

Elaum

Membre confirmé
12 Mars 2005
19
0
34
marseille
Bonjour.
Je me suis acheté le bouquin Cocoa par la pratique hier et j'essais d'améliorer son tuto pour faire un petite application de gestion de films.


Présentation du problème
J'ai déjà fait la base à savoir une classe Movie qui correspond a une classe de film (nom, directeur,note...)
J'ai écrit ma classe MyDocument et elle marche impec, gestion des NSTableView, sauvegarde des données...

Mon problème est que j'aimerais mettre un champ de recherche à la iTunes.
J'ai relié (IBAction)searchMovie: à mon NSSearchField.
J'ai tappé le code suivant
Bloc de code:
- (IBAction)searchMovie:(id)sender
{
	NSMutableArray *tmpArray;
	NSString *stringSearch = [sender stringValue];
	Movie *currentMovie;
	int i;
	if ([[sender stringValue] length] == 0) //Si clique sur cancel ou on delete
	{	
		//Il faudrait savoir si tmpArray a déjà été alloué
	} else { //Sinon on affiche tmpArray
		tmpArray = [[NSMutableArray alloc] init]; //On initialise la liste de films
		[tmpArray addObjectsFromArray:filmsArray];
		NSLog(@"Liste des films %@",tmpArray);
		for (i = 0 ; i < [filmsArray count] ; i++)
		{
			currentMovie = [filmsArray objectAtIndex:i];
			if ( ! [[currentMovie filmName] rangeOfString:stringSearch options:NSCaseInsensitiveSearch].length)
			{//Si le film n'est pas dans la recherche, on l'enlève
				[filmsArray removeObjectAtIndex:i];
			}
		} 
		NSLog(@"Liste de film restant %@",filmsArray);
		[tableView reloadData];
		[self updateUI];
	}
}

Il enlève normalement les films mais mon problème vient que losque je clique sur la croix du NSSearchFiled sans avoir fait de recherche ou que je délete les caracteres, il passe quand même dans la condition
if ([[sender stringValue] length] == 0)

Le truc c'est que s'il passe avant une recherche, tmpArray n'est pas initialisé (et alloué) et donc j'obtient une erreur de segmentation.

Ma question :confused:
Comment peut ont faire pour savoir si tmpArray existe déjà (est ce qu'il contient des films et auquel cas on doit réafficher)

Ou alors connaissez vous une méthode plus simple/rapide pour traiter mon problème.

J'espère être assez clair.:D
 

Céroce

Membre actif
Ce que je ferais:

A priori, tmpArray ne devrait pas être une locale, mais une variable d'instance pour pouvoir libérer l'espace du NSMutableArray lorsque ton objet (MyDocument) reçoit un -dealloc.

Dans la méthode init() de ton document, initialise tmpArray avec la valeur nil (ne pointe sur rien au départ)
Dans ta méthode, tu testes (if (tmpArray == nil)) dans quel cas tu l'alloue et l'initialise.




J'espère que je suis assez explicite, j'essayerai d'être plus clair sinon.:zen:
 

Elaum

Membre confirmé
12 Mars 2005
19
0
34
marseille
Merci ça marche impec. :up:

(pfff pourquoi parce que c'est pas du C, je perd mes bonne habitudes de déclaration de variable: mad: )

Petite question :
Dans mon dealloc, je fait [tmpArray release] mais si je l'ai jamais alloué ca pose un problème ou il faut que je rajoute un test???
 

ntx

Membre vénérable
Club MacG
15 Octobre 2004
12 128
376
92
Bonjour,
Elaum a dit:
Petite question :
Dans mon dealloc, je fait [tmpArray release] mais si je l'ai jamais alloué ca pose un problème ou il faut que je rajoute un test???
Il existe un système de compteur d'instances sur les objets :
- quand tu fais "alloc" il alloue de la mémoire et met le compteur à 1.
- quand tu fais un "retain" il augmente le compteur de un (si par exemple l'objet est placé dans un tableau).
- quand tu fais un "release" il le décrémente de 1, et quand il arrive à 0 alors la fonction dealloc est appelée.
Donc tu n'as pas besoin de tester si l'objet que tu "releases" est nul ou pas. Les explications en français et meilleures que les miennes sont chez Project Omega