2012-03-13 64 views
0

我不斷收到這個表明殭屍的錯誤。 我已經縮小到這兩種方法,但我不能爲我的生活找出什麼是錯的。[CFDictionary發佈]:發送到釋放實例的消息,出了什麼問題?

任何想法?

-(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

哪一行崩潰? – 2012-03-13 14:16:34

+0

你可以發佈'objectFromJSONString'方法的實現......並且incarna避免一行代碼風格,這很難閱讀。如果你能分解它,那就做吧.. – 2012-03-13 14:31:27

回答

2

這是你通過直接訪問伊娃獲得了經典的內存管理問題。使用訪問器來處理你的ivars,你的代碼會更簡單,你不會有這些類型的錯誤。

所以替換此代碼:

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

順便說一句,爲什麼你把所有這些放在@try塊中? ObjC中的異常處理很少見,代價昂貴,並且會泄漏內存。異常通常表示ObjC中不可恢復的錯誤,並不是一般的錯誤處理系統。有時候@try是合適的,但我在這裏沒有看到任何理由。

相關問題