2009-11-07 3 views
1

J'ai suivi la paix du code dans lequel j'ai spécifié la ligne qui fuit. Comme je suis nouveau sur le développement de l'iPhone, je ne peux pas comprendre ce qui ne va pas avec cette ligne. S'il vous plaît jeter un oeil à cette ligne et dites-moi.Quelle devrait être la raison derrière cette ligne qui fuit?

NSAutoreleasePool *pool = [[NSAutoreleasePool alloc]init]; 
    //take away 
    //NSURL *url1 = [[NSURL alloc] initWithString:@"http://url/Service.asmx/takeAwayList"]; 
    NSURL *url1 = [[NSURL alloc] initWithString:[NSString stringWithFormat:@"%@/Service.asmx/takeAwayList",serviceURL]]; 

    NSMutableURLRequest* request1=[NSMutableURLRequest requestWithURL:url1]; 
    [request1 setHTTPMethod:@"POST"]; 
    [request1 setTimeoutInterval:10]; 

    //*****the leaky line***********************/// 
    NSData *data2=[[NSURLConnection sendSynchronousRequest:request1 returningResponse:nil error:nil] autorelease]; 

    if(data2 == nil) 
    { 
     UIAlertView* alert = [[UIAlertView alloc]initWithTitle:@"Alert" message:@"The network is not available.\n Please check the Internet connection." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil]; 
     [alert show]; 
     [alert release]; 

    } 
    else 
    { 

     NSXMLParser *xmlParser1 = [[NSXMLParser alloc] initWithData:data2]; 

     //Initialize the delegate. 
     TakeAwayParser *takeAwayParser = [[TakeAwayParser alloc] initTakeAwayParser]; 

     //Set delegate 
     [xmlParser1 setDelegate:takeAwayParser]; 

     //Start parsing the XML file. 
     @try { 
      BOOL success = [xmlParser1 parse]; 
      if(success) 
       NSLog(@"No Errors"); 
      else 
       NSLog(@"Error Error Error!!!"); 
     } 
     @catch (NSException * e) { 
      NSLog(@"Exception in parsing %@ %@",[e name], [e reason]); 
     } 
     [takeAwayParser release]; 
     [xmlParser1 release]; 
    } 

    //[request1 release]; 
// [response1 release]; 
// 
    [url1 release]; 
// [data2 release]; 
    //new arrivals 
    //[data2 release]; 
    [pool release]; 

Répondre

2

J'ai eu des problèmes avec cela aussi dans mon projet Large. Après avoir travaillé avec un ingénieur d'Apple pour essayer de localiser les fuites, il a finalement demandé à l'équipe principale de développement d'Apple derrière NSURLConnection. Ils ont essentiellement dit qu'il y avait un cache interne qui n'est pas effaçable du tout dans NSURLConnection et c'était un problème connu.

J'ai donc cherché des alternatives. J'ai trouvé ASIHTTPConnection (lien ci-dessous) qui fonctionne de CFNetwork. Il est conçu pour être un remplacement de NSURLConnection, plus un tas d'autres goodies impressionnants comme le téléchargement sur le disque au lieu de la mémoire, la reprise du téléchargement, la barre de progression, etc ..

Je l'ai utilisé dans tous mes projets et n'ai jamais eu de problèmes ou de plaintes. Un, en réponse à votre question, voici comment je me suis débarrassé de ces fuites de mémoire.

http://allseeing-i.com/ASIHTTPRequest/

+0

Ceci est stupide mais je suis encore en phase d'apprentissage, donc pouvez-vous préciser ce que je devrais prendre de la page que vous avez redirigé et que dois-je remplacer dans mon code? – harshalb

+1

Je pense que ce petit code fonctionne aussi. pour l'instant les instruments ne me donnent pas d'autres fuites sur url après avoir mis ce code: NSMutableURLRequest * request1 = [NSMutableURLRequest requestWithURL: url1 cachePolicy: NSURLRequestReloadIgnoringCacheData timeoutInterval: 10.0]; \t [request1 setHTTPMethod: @ "POST"]; \t // [request1 setTimeoutInterval: 10]; \t [[NSURLCache sharedURLCache] setMemoryCapacity: 0]; \t [[NSURLCache sharedURLCache] setDiskCapacity: 0]; – harshalb

+0

C'est vraiment vieux, mais ce que Hib a ici fonctionne. Désolé de ressusciter un fil mort;) – gabaum10

1

Cette ligne ne fuit pas, vous ne devriez même pas l'autoreleasing. Faites-vous une faveur et lisez le Guide de gestion de la mémoire dans les documents de développement d'Apple, les sorties de commentaires dans votre code ne sont pas de bon augure.

EDIT: Hrm Je prends cela en arrière votre code est complètement bien, sauf pour cette ligne. Êtes-vous sûr qu'il fuit? Il renvoie un objet avec un nombre de retenue de 0, donc vous autoreleasing il devrait causer des problèmes car il a déjà un nombre de retenue de 0.

+0

Alors, pourquoi instruments me prend sur cette ligne à chaque fois? – harshalb

+0

Si je vais supprimer la autorelease alors aussi les instruments me guident sur cette ligne. Est-ce quelque chose que j'ai lu quelque part que les instruments donnent parfois des faux positifs ou de fausses fuites? – harshalb

Questions connexes