2011-01-11 6 views
0

je travaille sur une application de pêche ces jours-ci et je reçois un problème de fuite de mémoirefuite de mémoire liée

-(void)requestFinished:(ASIFormDataRequest *) request { 

     if(hud != nil){ 
      [hud show:NO]; 
      [hud release]; 
      hud = nil; 
     } 
     isLoading = NO; 
     self.responseText = [request responseString]; 
     [self parseXml];  //I am getting leak here 
     if ([self.responseText hasPrefix:@"<result>"]) { 
      UIAlertView *info = [[[UIAlertView alloc] initWithTitle:@" " message:@"Limited Internet access, please find a stronger signal in the area" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil]autorelease]; 
      [info show]; 
     } 

if (!isRefreshButtonClicked) {  
      [UIAccelerometer sharedAccelerometer].delegate = self; 
      [NSThread detachNewThreadSelector:@selector(parseXml) toTarget:self withObject:nil]; 
     } } 

Ceci est ma fonction ...

-(void) parseXml 
{ 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 

    _fishes = [[fishes parseXml:self.responseText] retain]; 

    [self performSelectorOnMainThread:@selector(parseXmlDone) withObject:nil waitUntilDone:YES]; 
     [pool release]; 

_fishes Voici un tableau qui est d'obtenir une valeur d'une fonction de type de retour de tableau ..... et voici cette fonction ...

+(NSMutableArray *)parseXml:(NSString *)xmlString { 
    //xmlString = [xmlString stringByReplacingOccurrencesOfString:@"&" withString:@""]; 
    const char *cString = [xmlString UTF8String]; 
    NSMutableArray *fishes = [NSMutableArray array]; 
    NSData *xmlData = [NSData dataWithBytes:cString length:strlen(cString)]; 
    NSError *error; 
    GDataXMLDocument *doc = [[GDataXMLDocument alloc]initWithData:xmlData options:0 error:&error]; 
    if (doc == nil) { return nil; } 
    //parseXml 
    NSArray *_fishes = [doc.rootElement elementsForName:@"fishery"]; 
    for (GDataXMLElement *_fish in _fishes) { 
     NSMutableDictionary *fish = [NSMutableDictionary dictionary]; 
     NSArray *ids = [_fish elementsForName:@"id"]; 
     if ([ids count]>0) { 
      GDataXMLElement *firstId = (GDataXMLElement *)[ids objectAtIndex:0]; 
      [fish setValue:firstId.stringValue forKey:@"id"]; 
     } else continue; 
     NSArray *names = [_fish elementsForName:@"name"]; 
     if ([names count]>0) { 
      GDataXMLElement *firstName = (GDataXMLElement *)[names objectAtIndex:0]; 
      [fish setValue:firstName.stringValue forKey:@"name"];........... 


    ........ 
else continue; 
     NSArray *distances = [_fish elementsForName:@"distance"]; 
     if ([distances count]>0) { 
      GDataXMLElement *distance = (GDataXMLElement *)[distances objectAtIndex:0]; 
      [fish setValue:distance.stringValue forKey:@"distance"]; 
     }else continue; 
     [fishes addObject:fish]; 
    } 
    [doc release]; 
    return fishes; 
} 
@end 

J'espère que u gars COMPRENDRE et mon problème ... Thanx

+0

Dans requestFinished: vous lancez automatiquement le alertview et vous appelez une méthode release. Je pense que cela causera un problème – Robin

+0

@robin j'avais édité ma question ...... et obtenir le même problème – Sudhanshu

+0

comment avez-vous su que vous obtenez une fuite de mémoire – Robin

Répondre

1

En -parseXml,

_fishes = [[fishes parseXml:self.responseText] retain]; 

fuira tout objet précédent _fishes pointait en cas -parseXml est envoyé plus d'une fois. Vous pouvez utiliser une propriété retain au lieu d'une variable d'instance ou une méthode setter qui libère l'objet précédent ou libérer l'objet précédent avant d'affecter un nouvel objet (conservé) à _fishes.