2012-03-13 2 views
0

Я продолжаю получать эту ошибку, которая указывает на зомби. Я сузил это до этих двух методов, но я не могу для жизни меня выяснить, что случилось.[CFDictionary release]: сообщение отправлено на освобожденный экземпляр, что случилось?

Любые идеи?

-(void) getWeatherDetail: (NSString *)query 
{ 
    @try 
    { 
     NSString *urlString111 = [NSString stringWithFormat:@"http://www.google.com/ig/api?weather=%@",query]; 
     urlString111 = [urlString111 stringByAddingPercentEscapesUsingEncoding:NSUTF8StringEncoding]; 
     NSURL *url = [NSURL URLWithString:urlString111]; 

     NSMutableURLRequest *theRequest = [NSMutableURLRequest requestWithURL:url]; 

     NSData *returnData = [NSURLConnection sendSynchronousRequest:theRequest returningResponse:nil error:nil]; 

     if(xmlParser) 
     { 
      xmlParser=nil; 
      [xmlParser release]; 

     } 


     xmlParser = [[NSXMLParser alloc] initWithData: returnData]; 
     isForeCast = NO; 
     isFirstForeCastEnd = NO; 
     if (!self.arrForecastAll) { 
      self.arrForecastAll = [[NSMutableArray alloc] init]; 
     } 
     [self.arrForecastAll removeAllObjects]; 
     [xmlParser setDelegate: self]; 
     [xmlParser setShouldResolveExternalEntities: YES]; 
     [xmlParser parse]; 

//  self.logString = [NSString stringWithFormat:@"%@Date & Time: %@ | Text: Getting Weather detail.\n", self.logString, [NSDate date]]; 
//  [self updateLogFile:self.logString]; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Ad exc %@",[exception description]); 
    } 
    @finally { 

    } 
} 

И это один ..

-(void)getCurrentCityName 
{ 
    //////Method to find current city name 
    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init]; 
    @try 
    { 
     if ([self.arrSettings count] > 0 && [[[self.arrSettings objectAtIndex:3] objectForKey:@"Value"] isEqualToString:@"Current Location"]) 
     { 
      if (currentlat != 0 && currentlong != 0) { 
       NSURL *urlString; 




       NSLog(@"lat %f %f" ,currentlat,currentlong); 
       urlString =[NSURL URLWithString:[NSString stringWithFormat:@"http://maps.google.com/maps/geo?output=json&oe=utf-8&ll=%f,%f&key=[removed API key]",currentlat,currentlong]]; 



       NSLog(@"\n\n-------------------------TF-Get City Name -Request-----------------------------\n%@\n\n",urlString); 
       NSMutableURLRequest *request = [[NSMutableURLRequest alloc] init] ; 

       [request setURL:urlString]; 
       NSData *returnData = [ NSURLConnection sendSynchronousRequest: request returningResponse:nil error: nil ]; 
       NSString *returnString = [[NSString alloc] initWithData:returnData encoding:NSUTF8StringEncoding]; 

       NSLog(@"\n\n------------------------TF-Get City Name -Response------------------------\n\n%@\n\n",returnString); 


       [request release]; 
       NSDictionary *dictAddress=[returnString objectFromJSONString]; 
       NSLog(@"dictAddress %@",[dictAddress description]); 

       [returnString release]; 

       NSString *strCity = [NSString stringWithFormat:@"Getting Location"]; 
       NSLog(@"strCity %@",strCity); 
       if ([[dictAddress allKeys] count] > 1) 
       { 

        if ([[[[[[dictAddress valueForKey:@"Placemark"] objectAtIndex:0] valueForKey:@"AddressDetails"] valueForKey:@"Country"] valueForKey:@"AdministrativeArea"] valueForKey:@"SubAdministrativeArea"]) 
        { 
         strCity = [NSString stringWithFormat:@"%@,%@", 
            [[[[[[[[dictAddress valueForKey:@"Placemark"] objectAtIndex:0] valueForKey:@"AddressDetails"] valueForKey:@"Country"] valueForKey:@"AdministrativeArea"] valueForKey:@"SubAdministrativeArea"] valueForKey:@"Locality"] valueForKey:@"LocalityName"], 
            [[[[[[dictAddress valueForKey:@"Placemark"] objectAtIndex:0] valueForKey:@"AddressDetails"] valueForKey:@"Country"] valueForKey:@"AdministrativeArea"] valueForKey:@"AdministrativeAreaName"]]; 
        } 
        else { 
         strCity = [NSString stringWithFormat:@"%@,%@", 
            [[[[[[[dictAddress valueForKey:@"Placemark"] objectAtIndex:0] valueForKey:@"AddressDetails"] valueForKey:@"Country"] valueForKey:@"AdministrativeArea"] valueForKey:@"Locality"] valueForKey:@"LocalityName"], 
            [[[[[[dictAddress valueForKey:@"Placemark"] objectAtIndex:0] valueForKey:@"AddressDetails"] valueForKey:@"Country"] valueForKey:@"AdministrativeArea"] valueForKey:@"AdministrativeAreaName"]]; 
        } 

        self.strCurrentCity = strCity; 
        [self getWeatherDetail:self.strCurrentCity]; 
       } 

      } 
      else 
      { 
       self.strCurrentCity = @"Current Location"; 
      } 

     } 
     else 
     { 
      self.strCurrentCity = [[self.arrSettings objectAtIndex:3] objectForKey:@"Value"]; 
      [self getWeatherDetail:self.strCurrentCity]; 
     } 

//  self.logString = [NSString stringWithFormat:@"%@Date & Time: %@ | Text: Getting current city name. CityName: %@\n", self.logString, [NSDate date], self.strCurrentCity]; 
//  [self updateLogFile:self.logString]; 


     [pool release]; 
    } 
    @catch (NSException *exception) { 
     NSLog(@"Ad exc %@",[exception description]); 
    } 
    @finally { 

    } 
} 
+1

В какой строке происходит сбой? –

+0

Вы могли бы опубликовать реализацию метода objectFromJSONString ... и incarna избегать одного стиля кодирования строки, его трудно прочитать. Если вы можете сломать это, сделайте это .. –

ответ

2

Это классическая проблема управления памятью, что вы получите от прямого доступа Ивар. Используйте аксессоров для работы с вашими иварами, и ваш код будет проще, и у вас не будет таких ошибок.

Так замените этот код:

if(xmlParser) 
    { 
     xmlParser=nil; 
     [xmlParser release]; 
    } 

    xmlParser = [[NSXMLParser alloc] initWithData: returnData]; 
    isForeCast = NO; 
    isFirstForeCastEnd = NO; 
    if (!self.arrForecastAll) { 
     self.arrForecastAll = [[NSMutableArray alloc] init]; 
    } 

с:

self.xmlParser = [[[NSXMLParser alloc] initWithData: returnData] autorelease]; 
    self.isForeCast = NO; 
    self.isFirstCoreCastEnd = NO; 
    if (!self.arrForecastAll) { 
     self.arrForecastAll = [NSMutableArray array]; 
    } 

Это также устраняет течи в вашем назначении на arrForecastAll.

Что касается вашего второго блока, то в любое время, когда вы используете release переменную, вы всегда должны устанавливать ее на nil, если переменная не сразу выходит из области видимости. Так, например, у вас [request release] следует request = nil.

BTW, почему вы все это помещаете в блок @try? Обработка исключений в ObjC - это редкая, дорогая и утечка памяти. Исключения обычно указывают на неустранимые ошибки в ObjC и не являются общей системой обработки ошибок. Есть моменты, когда @try подходит, но я не вижу здесь никакой причины.

 Смежные вопросы

  • Нет связанных вопросов^_^