IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

XCode Discussion :

Probleme d'acces à une NSMutableArray [iOS 4.x]


Sujet :

XCode

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Par défaut Probleme d'acces à une NSMutableArray
    Bonjour à tous,

    A la fois nouveau dans le monde des développeurs pour Iphone, je rencontre un petit soucis qui doit être tout bête j'imagine, mais que je n'ai pas trouvé

    je travaille sur une UITableView, qui va charger ses éléments sur SQLite (Chargement des données OK et testé)

    Au moment de l'insertion du texte de la cellule dans cellForRowAtIndexPath les valeurs de mon MSMutableArray (nommé listStation) sont comme "inaccessible".... une idée? (J'ai commenté le code, voir //Ici sa crash)


    Mon .h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    #import "Station.h"
    #import "SQLManager.h"
    
    
    @interface SecondViewController : UIViewController {
    	(...)
    
    	//Data
    	NSMutableArray *listStation;
    	NSMutableArray *listStationSearched; 
    	Station *stationSearched;
    	SQLManager *sqlManager;
    
    }
    
    (...)
    
    (...)
    @property(nonatomic,retain) NSMutableArray *listStation;
    @property(nonatomic,retain) NSMutableArray *listStationSearched;

    Mon .m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    
    @synthesize... //Correctement
    
    // Implement viewDidLoad to do additional setup after loading the view, typically from a nib.
    - (void)viewDidLoad {
    	// Custom font, color
    	[super viewDidLoad];
    	stationSearched = nil;
    	//Initialize the array.
    	listStation = [[NSMutableArray alloc]init];
    	listStationSearched = [[NSMutableArray alloc]init];
    	
    	// initialisation de la BDD
    	
    	sqlManager = [[SQLManager alloc] initDatabase];
    	[sqlManager checkAndCreateDatabase];
    	[sqlManager readStationTableFromDatabase];
    	
    	NSInteger i = 0;
    	
            //Retourne 4 (nbLigne dans la table Station sur SQLite)
    	NSLog(@"Data Sql:%d",[sqlManager.stationTable count]);
    	while (i < [sqlManager.stationTable count])
    	{
    		Station *oneStation = (Station *)[sqlManager.stationTable objectAtIndex:i];
    		[listStation addObject:oneStation];
    		//NSLog(@"%@",[oneStation nameStation]);
    		i++;
    		//[oneStation release];
    	}	
    	//Retourne 4 (Contient les objets de la BDD)
    	NSLog(@"Data App:%d",[listStation count]);
    	//Retourne le nom de la station 1 (Fonctionne)
    	NSLog(@"%@",[[listStation objectAtIndex:1]nameStation]);
    
    
    	boolSearching = NO;
    	boolLetUserSelectRow = (BOOL *)YES;
    	
    	//[sqlManager release];
    	//[tramArray release];
    	//[busArray release];
    	
    }
    
    - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    	
    	static NSString *CellIdentifier = @"Cell";
    	
    	UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    	if (cell == nil) {
    		cell = [[[UITableViewCell alloc] initWithFrame:CGRectZero reuseIdentifier:CellIdentifier] autorelease];
    	}
    	
    	
    	if(boolSearching){
    		if([listStationSearched count] > 0){
    			/*[cell.textLabel setText:[[listStationSearched objectAtIndex:indexPath.row] nameStation]];
    			[cell.detailTextLabel setText:[NSString stringWithFormat:@"%d", [[listStationSearched objectAtIndex:indexPath.row] numberStation]]];*/
    
    		}
    			}else {
    		if([listStation count] > 0){
    		//Ici sa crash, il n'arrive pas a transmettre l'objet :/
    		NSLog(@"%@",[[listStation objectAtIndex:indexPath.row] nameStation]);
    		NSLog(@"%d",[[listStation objectAtIndex:indexPath.row] numberStation]);
    		//[cell.textLabel setText:[[listStation objectAtIndex:indexPath.row] nameStation]];
    		//[cell.detailTextLabel setText:[NSString stringWithFormat:@"%d", [[listStation objectAtIndex:indexPath.row] numberStation]]];
    			
    		
    		}
    	}
    	
    	return cell;
    	
    	 }
    
    	 @end

  2. #2
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    a priori :

    a. la méthode nameStation renvoit un objet qui a été autoreleased
    b. ne renvoit pas un objet qui répond à la méthode "description" (appelée pour le format %@)
    c. a une méthode "description" buggée

    il faudrait donc vérifier le code de la classe Station.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Par défaut
    Merci pour tes conseils JeitEmgie

    La réponse a. me semble la plus cohérente, mais je n'ai pas trouvé pourquoi.
    La réponse b., vu que c'est un string %@ est approprié
    La réponse c., j'ai pas très bien compris ^_^

    Mon objet station:

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @interface Station : NSObject {
    
    	NSInteger *numberStation;
    	NSString *nameStation;
    
    }
    
    @property(assign, nonatomic) NSInteger *numberStation;
    @property(retain, nonatomic) NSString *nameStation;
    
    -(id)initWithName:(NSInteger *)_numberStation nameStation:(NSString *)_nameStation;
    @end
    .m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #import "Station.h"
    
    @implementation Station
    @synthesize numberStation,nameStation;
    
    -(id)initWithName:(NSInteger *)_numberStation nameStation:(NSString *)_nameStation;
    {
    	numberStation =(NSInteger *) _numberStation;
    	nameStation = _nameStation;
    	return self;
    }
    
    - (void) dealloc {
    	[numberStation release];
    	[nameStation release];
    	[super dealloc];
    }
    
    @end
    Une idée?

    EDIT: je précise que dans le viewDidLoad, les éléments sont bien chargés ( j'ai testé avec NSLog(@"%@",[[listStation objectAtIndex:1]nameStation])). J'ai pourtant rien mis pour autorelease

  4. #4
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par OsTaLaKaR Voir le message
    La réponse b., vu que c'est un string %@ est approprié
    La réponse c., j'ai pas très bien compris ^_^
    %@ dans un format signifie que l'on aura en sortie la NSString retournée par la méthode "description" appliquée à l'argument correspondant…
    Pour un NSString, l'implémentation de "description" se contente de retourner "self".
    Mais pour vos propres classes, rien ne vous empêche d'implémenter une "description" qui vous permette de loguer des informations plus pertinentes que juste la classe de l'objet et son adresse sous forme hexadécimale, dès lors un NSLog(@"%@", …) qui se plante peut aussi être causé par une bug dans l'implémentation de "description"… mais ce n'est pas le cas chez vous visiblement…


    Mon objet station:

    .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    @interface Station : NSObject {
    
    	NSInteger *numberStation;
    	NSString *nameStation;
    
    }
    
    @property(assign, nonatomic) NSInteger *numberStation;
    @property(retain, nonatomic) NSString *nameStation;
    
    -(id)initWithName:(NSInteger *)_numberStation nameStation:(NSString *)_nameStation;
    @end
    .m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #import "Station.h"
    
    @implementation Station
    @synthesize numberStation,nameStation;
    
    -(id)initWithName:(NSInteger *)_numberStation nameStation:(NSString *)_nameStation;
    {
    	numberStation =(NSInteger *) _numberStation;
    	nameStation = _nameStation;
    	return self;
    }
    
    - (void) dealloc {
    	[numberStation release];
    	[nameStation release];
    	[super dealloc];
    }
    
    @end
    je parierais sur le fait que vous mélangez les concepts :
    NSInteger est un typedef pas une classe ! (à ne pas confondre avec NSNumber … qui lui est une classe)

    donc déjà
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    	[numberStation release];
    çà sent le sapin…

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2009
    Messages
    48
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2009
    Messages : 48
    Par défaut
    Je n'avais pas connaissance de NSNumber ! sa me parait d'ailleurs plus logique maintenant

    En effet avec sa, sa fonctionne largement mieux

    Dernière petite question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [NSNumber numberWithInt:aId];
    Pourquoi cette transformation transforme mon Integer (540) en (775690) ?

    En tout cas merci!

  6. #6
    Membre Expert
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 963
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 963
    Par défaut
    Citation Envoyé par OsTaLaKaR Voir le message
    Je n'avais pas connaissance de NSNumber ! sa me parait d'ailleurs plus logique maintenant

    En effet avec sa, sa fonctionne largement mieux

    Dernière petite question

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [NSNumber numberWithInt:aId];
    Pourquoi cette transformation transforme mon Integer (540) en (775690) ?

    En tout cas merci!
    et aId c'est quoi ?
    775690 çà a tout l'air d'être une adresse mémoire… donc aId serait un pointeur ? (un objet probablement ?)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme d'acces à une vue dans un package
    Par cli16 dans le forum SQL
    Réponses: 12
    Dernier message: 12/02/2007, 16h41
  2. Problem d'acces à une bd Oracle9i
    Par casawi dans le forum Administration
    Réponses: 10
    Dernier message: 29/01/2007, 11h35
  3. Réponses: 16
    Dernier message: 04/01/2007, 13h40
  4. [POSTGRESQL - C#] Probleme d'accès à une table
    Par angusyoung34 dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 31/12/2005, 13h33
  5. Réponses: 4
    Dernier message: 15/01/2005, 16h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo