plantage après quelques minutes
Bonjour !
Voilà j'ai un petit programme qui exécute la fonction download ci-dessous à l'aide d'un NSThread :
[NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:self];
puis on exécute cette fonction en boucle à l'aide de performSelector:withObject:afterDelay: ... Tout marche correctement, sauf que l'application fuit... et donc qu'après un certain temps, roue de la mort et plantage...
Désolé pour la longueur... Donc voilà ... si y'a une bonne âme qui voit où est le problème... Et m'expliquer ce que je n'ai sans doute pas compris au sujet de l'allocation mémoire : je connais le coup du compteur qui doit être égal à 0 et qu'on augmente avec retain et diminue avec release, mais ça s'arrête là ...
merchiii
Voilà j'ai un petit programme qui exécute la fonction download ci-dessous à l'aide d'un NSThread :
[NSThread detachNewThreadSelector:@selector(download) toTarget:self withObject:self];
puis on exécute cette fonction en boucle à l'aide de performSelector:withObject:afterDelay: ... Tout marche correctement, sauf que l'application fuit... et donc qu'après un certain temps, roue de la mort et plantage...
<br />-(void)download<br />{<br /> <br /> NSAutoreleasePool *pool=[[NSAutoreleasePool alloc]init];<br /> [_lock lock];<br /> NSURL *url = [NSURL URLWithString:[urlTextField stringValue]];<br />Â Â NSString *lastPathComp = [(id)CFURLCopyLastPathComponent((CFURLRef)url) autorelease];<br />Â Â NSString *fileName;<br />Â Â if (!url) {<br />Â Â Â Â [self appendStatusString:[NSString stringWithFormat:@"Could not create URL for %@", [urlTextField stringValue]] forURL:nil];<br />Â Â Â Â return;<br />Â Â }<br />Â Â if (!lastPathComp || [lastPathComp length] == 0 || [lastPathComp isEqualToString:@"/"]) {<br />Â Â Â Â lastPathComp = @"urlLoad";<br />Â Â }<br />Â Â fileName = [NSString stringWithFormat:@"/tmp/%@", lastPathComp];<br /> <br /> NSURLRequest *theRequest=[NSURLRequest requestWithURL:url cachePolicy:NSURLRequestUseProtocolCachePolicy timeoutInterval:60.0];<br /> <br /> NSURLConnection *theConnection=[[[NSURLConnection alloc] initWithRequest:theRequest delegate:self]autorelease];<br /> if (theConnection) {<br /> receivedData=[[NSMutableData data] retain];<br /> } else {<br /> [self appendStatusString:@"Erreur !" forURL:nil];<br /> }<br /> [[NSRunLoop currentRunLoop]run];<br /> [_lock unlock];<br /> [pool release];<br /> [NSThread exit];<br />}<br />- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response<br />{<br /> [receivedData setLength:0];<br />}<br />- (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data<br />{<br />Â Â [receivedData appendData:data];<br />}<br />- (void)connectionDidFinishLoading:(NSURLConnection *)connection<br />{<br /> laSource=[[NSString alloc] initWithData:receivedData encoding:NSUTF8StringEncoding];<br /> if ([watchButton title]==@"stop")<br /> {<br /> [self performSelector:@selector(clear:)];<br /> [self appendStatusString:laSource forURL:nil];<br /> }<br /> <br /> <br /> [alertRadio getRow:&row column:&column ofCell:[alertRadio selectedCell]]; <br /> if([laSource rangeOfString:[stringTextField stringValue]].length && !column || ![laSource rangeOfString:[stringTextField stringValue]].length && column )<br /> {<br /> //plein de trucs mais c'est pas le problème, il plante en passant toujours dans le else<br /> } else { <br /> [self performSelector:@selector(download) withObject:nil afterDelay:[time intValue]];<br /> }<br /> } else {<br /> if ([watchButton title]==@"stop")<br /> {<br /> [self performSelector:@selector(download) withObject:nil afterDelay:[time intValue]];<br /> <br /> }<br /> } <br /> [connection release];<br /> [receivedData release];<br />}<br />
Désolé pour la longueur... Donc voilà ... si y'a une bonne âme qui voit où est le problème... Et m'expliquer ce que je n'ai sans doute pas compris au sujet de l'allocation mémoire : je connais le coup du compteur qui doit être égal à 0 et qu'on augmente avec retain et diminue avec release, mais ça s'arrête là ...
merchiii

Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pourquoi ne pas faire un truc comme ça :
Au passage, ton [NSThread exit] est inutile, puisque tu arrives à la fin de la fonction qui définit le thread.
+
Chacha
[tt]if ([watchButton title]==@stop)
[/tt]
Cela fonctionnerait mieux non ?
[tt]
if ([[watchButton title] isEqualToString:@stop])
[/tt]
Comparaison de pointeur de chaine au lieu de son contenu... Y'a longtemps que j'avais pas revu un classique comme celui là
Bin oué jsuis nul... C'est comme ça...
Sinon merci pour les conseils, je regarderais tout ça demain...
Je sais pas si t'as déjà utilisé les NSThread, mais apparemment chaque NSThread a sa runloop qui lui est propre, et donc pour que les performSelector: withDelay: fonctionnent, je suis obligé de faire ce [[NSRunLoop currentRunLoop]run]... Je vais essayer de faire avec un while() comme tu me le suggère, mais je vais bien être obbligé de garder cette histoire de runLoop parce que sinon les méthodes comme - (void)connectionDidFinishLoading:(NSURLConnection *)connection ne sont jamais appelées..
D'ailleurs ça m'arrive encore...