plantage après quelques minutes

05:49 modifié dans Vos applications #1
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...
<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:@&quot;Could not create URL for %@&quot;, [urlTextField stringValue]] forURL:nil];<br />        return;<br />    }<br />    if (!lastPathComp || [lastPathComp length] == 0 || [lastPathComp isEqualToString:@&quot;/&quot;]) {<br />        lastPathComp = @&quot;urlLoad&quot;;<br />    }<br />    fileName = [NSString stringWithFormat:@&quot;/tmp/%@&quot;, 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:@&quot;Erreur !&quot; 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]==@&quot;stop&quot;)<br />	{<br />		[self performSelector:@selector(clear:)];<br />		[self appendStatusString:laSource forURL:nil];<br />	}<br />	<br />	<br />	[alertRadio getRow:&amp;row column:&amp;column ofCell:[alertRadio selectedCell]];	<br />	if([laSource rangeOfString:[stringTextField stringValue]].length &amp;&amp; !column || ![laSource rangeOfString:[stringTextField stringValue]].length &amp;&amp; column )<br />	{<br />		//plein de trucs mais c&#39;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]==@&quot;stop&quot;)<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  :D

Réponses

  • AliGatorAliGator Membre, Modérateur
    05:49 modifié #2
    heu c'est exprès que laSource est alloc/init mais pas release ?
  • ChachaChacha Membre
    05:49 modifié #3
    J'ai une autre remarque d'ordre plus général : je ne sais pas à  quoi sert la runloop (je n'en ai jamais utilisé), du coup je me dis que ce n'est peut-être pas une méthode bien orthodoxe que nous avons là . Toi, tu voudrais que ton thread travaille en boucle en tâche de fond ?
    Pourquoi ne pas faire un truc comme ça :
    <br />  NSAutoreleasePool* threadAutoreleasePool = [[NSAutoreleasePool alloc] init];<br />  while(!uneConditiond&#39;arrêt)<br />  {<br />    //faire un truc<br />    ...<br />    [NSThread sleepUntilDate:[[NSDate date] addTimeInterval:2]];//s&#39;endormir 2 secondes<br />  }<br />  [threadAutoreleasePool release];<br />
    


    Au passage, ton [NSThread exit] est inutile, puisque tu arrives à  la fin de la fonction qui définit le thread.

    +
    Chacha
  • Eddy58Eddy58 Membre
    05:49 modifié #4
    A la place de :
    [tt]if ([watchButton title]==@stop)
    [/tt]
    Cela fonctionnerait mieux non ? :o
    [tt]
    if ([[watchButton title] isEqualToString:@stop])
    [/tt]
  • AliGatorAliGator Membre, Modérateur
    05:49 modifié #5
    dans 1124579483:

    A la place de :
    [tt]if ([watchButton title]==@stop)
    [/tt]
    Cela fonctionnerait mieux non ? :o
    [tt]
    if ([[watchButton title] isEqualToString:@stop])
    [/tt]
    Oooh, yum, jolie celle là ...
    Comparaison de pointeur de chaine au lieu de son contenu... Y'a longtemps que j'avais pas revu un classique comme celui là  :)
  • 05:49 modifié #6
    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...
  • 05:49 modifié #7
    au fait @chacha
    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..
  • AliGatorAliGator Membre, Modérateur
    05:49 modifié #8
    dans 1124588293:

    Y'a longtemps que j'avais pas revu un classique comme celui là Â 


    Bin oué jsuis nul...  C'est comme ça...  :(
    Mais non on l'a tous fait cette erreur t'inquiète, moi le premier...
    D'ailleurs ça m'arrive encore... ;)
Connectez-vous ou Inscrivez-vous pour répondre.