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

Objective-C Discussion :

Impossible d'afficher un NSString


Sujet :

Objective-C

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Impossible d'afficher un NSString
    Bonjour,

    Dans mon application Iphone, j'ai des objets de type ArretSynthese avec comme attributs NomArret et Ville.

    Juste après le remplissage de mon tableau qui comporte mes ArretSynthese, je fais un test si je peux accéder aux attributs :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    for (ArretSynthese *arretSynthese in tabListeArrets) {
    		NSLog(@"%@",arretSynthese.Ville);
    }
    Cela fonctionne parfaitement, j'obtiens bien la liste des villes.
    Même résultat si je demande arretSynthese.NomArret.

    Plus tard dans mon programme, je fais appel à ce même tableau.
    Et c'est la que mon problème arrive. Autant je peux parfaitement accéder à l'attribut NomArret, mais impossible pour l'attribut Ville. Mon programme quitte subitement, sans laisser le moindre message d'erreur en console.

    Ce code fonctionne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    	for (ArretSynthese *arretSynthese in [listeArret tabListeArrets]) {
    		if ([arretSynthese isKindOfClass:[ArretSynthese class]]) {
    			NSLog(@"Type : arretSynthese");
    			if ([arretSynthese.NomArret isKindOfClass:[NSString class]]) {
    				NSLog(@"NomArret : type String");
    			}
    		}
    	}
    mais si je change l'attribut NomArret par l'attribut Ville dans le test de type de la classe, mon programme requitte subitement sans message d'erreur. Je pense pas que ce soit normal que le programme plante quand utilise la méthode isKindOfClass ...

    C'est étrange, car après le remplissage du tableau, j'ai accès à mes 2 attributs, puis au cours du programme, je perds l'accès à "Ville".

    Je précise que nul part ailleurs dans mon programme je modifie/lit mon tableau contenant mes objets ArretSynthese.

    J'ai regardé du côté du setter de l'attribut Ville pour voir ce qui pouvait poser problème.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    -(void) setVille:(NSString *)ville{
    }
    Si j'utilise dans cette méthode :
    ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ville = [NSString stringWithFormat:@"%@",ville];
    Cela fait planter mon programme quand j'essaye d'accèder à l'attribut Ville.

    Par contre, si je fais :
    ou encore
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Ville = [[NSString alloc] initWithFormat:@"%@",ville];
    la, je peux accèder à mon attribut "Ville" partout dans mon programme.
    Mais je peux pas laisser çà, car je ne peux pas faire ni de release, ni de autorelease. Et le nom de ma ville change.

    Je preneur de toutes explications, doc, car je trouve ce problème très étrange.

    J'éspere avoir été le plus clair possible.

    Merci d'avance
    Krisp

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

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 952
    Points : 4 378
    Points
    4 378
    Par défaut
    Citation Envoyé par Krispcool Voir le message
    la, je peux accèder à mon attribut "Ville" partout dans mon programme.
    Mais je peux pas laisser çà, car je ne peux pas faire ni de release, ni de autorelease. Et le nom de ma ville change.
    vous ne "pouvez" pas faire de release ?
    autant dire tout de suite que c'est mal parti si vous vous imposez de telles conditions.

    la solution la plus simple est de demander au compilateur de faire ce qu'il faut pour vous avec @property et @synthesize:

    dans le .h:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    @interface{NSString *ville ;
    …
    }
     
    @property (nonatomic, retain) NSString *ville;
     
    @end
    dans le .m
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    @implementation …
     
    @synthesize ville ;
     
    @end
    et le code généré pour le setter et le getter (même quand implicite aux assignations directes) s'occupera de faire les retain et release correctement, votre seule tâche étant de donner au getter un objet autoreleased sinon l'analyseur de code vous signalera que l'objet a retain count > 1.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    arretSynthese.ville = @"constant" ; // OK
    arretSynthese.ville = [NSString string… ] ; // OK
    arretSynthese.ville = [[NSString alloc] init… ] ; // BAD retain count > 1 after assignation

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2010
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2010
    Messages : 2
    Points : 2
    Points
    2
    Par défaut
    Merci pour la réponse JeitEmgie

    Citation Envoyé par JeitEmgie Voir le message
    vous ne "pouvez" pas faire de release ?
    autant dire tout de suite que c'est mal parti si vous vous imposez de telles conditions.
    C'est pas que je ne voulais pas, c'est que je ne pouvais pas en faire. Si j'essayais de faire un release, ou autorelease, le programme plantait encore plus lamentablement.

    Je savais que l'on pouvait générer les accesseurs et mutateurs automatiquement. Je suis persuadé que j'ai essayé cette solution auparavant, ce qui m'avait amené à écrire mes propres méthodes justement. Mais, la elle fonctionne à merveille. J'avais du faire une petite erreur quelque part avant. En reprenant votre code de 0, c'est bon.

    Merci
    Krispcool

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

Discussions similaires

  1. Impossible d'afficher Phpmyadmin
    Par freevisit dans le forum Apache
    Réponses: 4
    Dernier message: 24/02/2006, 15h54
  2. impossible d'afficher la page
    Par illegalsene dans le forum Apache
    Réponses: 1
    Dernier message: 17/01/2006, 10h07
  3. impossible d'afficher
    Par cyrill.gremaud dans le forum Flash
    Réponses: 3
    Dernier message: 19/12/2005, 12h56
  4. Réponses: 2
    Dernier message: 21/07/2005, 14h20
  5. [EasyPHP]"impossible d'afficher la page"
    Par Nip dans le forum Apache
    Réponses: 3
    Dernier message: 07/04/2005, 21h23

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