0

ゾンビを示すこのエラーが発生し続けます。この 2 つの方法に絞り込みましたが、私の人生では何が問題なのかわかりません。

何か案は?

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

    }
}
4

1 に答える 1

2

これは、ivar への直接アクセスによって発生する典型的なメモリ管理の問題です。アクセサーを使用して ivar を処理すると、コードが単純になり、この種のバグがなくなります。

したがって、このコードを置き換えます。

    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

2番目のブロックに関しては、変数を使用するときはいつでも、変数がすぐに範囲外に出ない場合releaseは常にに設定する必要があります。nilしたがって、たとえば、[request release]が続く必要がありますrequest = nil

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

于 2012-03-13T15:15:52.307 に答える