Ce forum est en partie financé par l’affichage de publicités. Merci de désactiver votre bloqueur de publicités pour nous permettre de continuer à fournir ce service.

problème de passage d'argument NSString

Discussion dans 'Développement Mac' créé par jannold2, 14 Septembre 2008.

  1. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    Bonjour
    j'ai un petit problème quand je fais :

    Code (Text):
    -(void) mafonction:(NSString*) param {
        NSLog(@"mafonction : %s\n", param);
    }

    et dans un thread
    [self performSelectorOnMainThread:@selector(mafonction:) withObject:@"coucou" waitUntilDone:YES ];
     
    en fait c'est pour iPhone et mafonction cherche à changer l'état de controles en fonction de son paramètre (d'ailleurs je ne sais pas pourquoi ce n'est pas permis depuis un thread...)

    toujours est-il que le NSLog m'affiche toujours †dD†»

    et quand je remplace NSString* par NSInteger*, là par contre ça diffère si je passe 0 ou 1 ou 2 ou ... (ca me met des nombres genre 400000, 430000, ...)

    Merci d'avance si vous avez la réponse à cette (épineuse ?) question
    Thomas
     
  2. molgow

    molgow Vétéran
    Club MacG

    Inscrit:
    4 Janvier 2002
    Messages:
    5 493
    J'aime reçus:
    612
    Parce que tu imprimes la valeur du pointeur de NSString au lieu de la chaîne elle même. Sauf erreur, il faudrait faire NSLog(..., &param) ou alors modifier le type de param : NSString au lieu de NSString*.
     
  3. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    :D tu as toujours le meme probleme de comprenhension de gestion de la memoire
    :rolleyes: je te conseille de laisser tomber tes devs tant que tu n'as pas saisi ce principe
    de base. :p;)
    Code (Text):
    MYAPPDELEGATE

    - (void)applicationDidFinishLaunching:(UIApplication *)application {
        [NSThread detachNewThreadSelector:
            @selector(MyThread) toTarget:self withObject:nil];
    }
       
    - (void)MyThread {
        NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

        NSString *message = [NSString stringWithFormat:@"message: %@", @"toto"];
       
        [self performSelectorOnMainThread:@selector(alert:) withObject:message waitUntilDone:YES];
       
        [pool release];
       
        return;
    }

    - (void)alert:(NSString *)message
    {
        myAlert = [[UIAlertView alloc] initWithTitle:@"Warning"
            message:message delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
           
        [myAlert show];
        [myAlert release];
       
        NSLog(@"%@", message);
       
        return;
    }
     
     
  4. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    ah oui je suis bête
    en fait pour afficher une chaine (nsstring*) c'est NSLog( "%@", chaine)
    sinon pour les entiers il faut faire [param intValue]
    il ne faut donc pas mettre de &param
    désolé si la question semble bête, mais j'espère au moins que ça aidera d'autres débutants comme moi :)

    ca ne venait donc pas de la mémoire pour une fois (effectivement j'avais tenté des retain et autres sans comprendre) mais c'est vrai qu'il faudra bien la comprendre un jour ^^
     
  5. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    et à propos, pourquoi est-ce "interdit" de toucher aux objets depuis un thread autre que le mainThread ?
     
  6. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    c'est pas interdit c'est juste qu ils font partie d'un autre thread donc invisible

    global int state = 1;


    mainthread
    start_new_thread
    do something
    while(state)

    mainthread
    state = 0;

    un sub-thread ne pe pas commander un parent object
    ce n'est pas lie au language mais il peut "renseigner"

    c'est pour cela qu on a invente les observers, les notifications
    Inter-Process Communication
     
  7. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    Code (Text):

    -(void) mafonction:(NSString*) param {
           NSLog(@"mafonction : %s\n", [param cStringUsingEncoding:NSUTF8StringEncoding]);
    }
     
     
  8. jannold2

    jannold2 Membre junior

    Inscrit:
    11 Avril 2007
    Messages:
    55
    J'aime reçus:
    0
    mouais je ne suis pas convaincu concernant le threading
    en fait si on met int n dans le .h, et n=2 avant de lancer le thread, et bien le thread peut quand meme lire n.
    par contre pour ce qui est graphique ca met tout dans une sorte de file d'attente j'ai l'impression, et dès que le thread est fini là ca affiche tout comme on voulait. (et donc ce n'est pas un probleme d'invisibilité)
     
  9. tatouille

    tatouille Vétéran

    Inscrit:
    1 Juin 2004
    Messages:
    5 174
    J'aime reçus:
    494
    bien sur qu il accede a la global mais si tu changes n dans le sub thread

    n pour le mainthread sera toujours 2
     
Chargement...