2012-03-13 6 views
0

ゾンビを示すこのエラーが発生し続ける。 私はこれら2つの方法に絞っていますが、私の人生は何が間違っているのか理解できません。[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 { 

    } 
} 

そして、この1 ...

-(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は1行のコーディングスタイルを避けるため、読みにくいです。あなたがそれを分解することができれば.. –

答えて

2

これは、あなたが直接IVARのアクセスによって取得古典的なメモリ管理の問題です。あなたの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変数の2番目のブロックについては、変数がすぐに有効範囲外にならない場合は、常にnilに設定する必要があります。たとえば、[request release]にはrequest = nilが続かなければなりません。

ところで、なぜこのすべてを@tryブロックに入れていますか? ObjCの例外処理はまれで、高価であり、メモリをリークします。例外は一般的にObjCの回復不可能なエラーを示し、一般的なエラー処理システムではありません。 @tryが適切な時がありますが、ここには何の理由もありません。