[Выпуск CFDictionary]: сообщение отправлено освобожденному экземпляру. Что не так? - PullRequest
0 голосов
/ 13 марта 2012

Я продолжаю получать эту ошибку, которая указывает на зомби. Я сузил это до этих двух методов, но я не могу понять, в чем дело.

Есть идеи?

-(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 Ответ

2 голосов
/ 13 марта 2012

Это классическая проблема управления памятью, возникающая при прямом доступе к 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.

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

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

...