problème de passage d'argument NSString

jannold2

Membre confirmé
11 Avril 2007
55
0
39
Bonjour
j'ai un petit problème quand je fais :

Bloc de code:
-(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
 
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*.
 
: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;)
Bloc de code:
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;
}
 
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 ^^
 
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
 
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é)
 
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é)

bien sur qu il accede a la global mais si tu changes n dans le sub thread

n pour le mainthread sera toujours 2