Блоки и управление памятью - PullRequest
0 голосов
/ 11 августа 2011

Вчера я задал вопрос об управлении памятью и Singletons ( Правильное управление хранилищем данных Singleton в IOS с веб-службой ).Последние 36 часов я ломал голову, пытаясь отследить проблему, и после тщательного тестирования с помощью NSLog и т. Д. Я могу только заключить, что объекты, размещенные в блоках, не выпускаются автоматически.Я использовал блоки как способ обработки асинхронных ответов веб-сервиса.Я также отправляю блок из контроллера представления, который должен сделать запрос веб-службы, чтобы он мог выполнять любые действия, основанные на ответе веб-службы.В надежде, что исчерпывающий обзор моего кода поможет найти решение, я помещаю весь код, который вызывает проблему, здесь:

Первый шаг - сделать запрос от моего корневого контроллера представления.Когда он загружается, я запрашиваю у всех пользователей «Hollers» термин, который я использую внутри для обозначения событий.Когда загружается контроллер корневого представления, я вызываю метод, который содержит следующий код:

HollerWebService *api = [[HollerWebService alloc]init];
//NSLog(@"About to get the hollers for userId: %@", [[[CurrentSession defaultStore]currentUser]userId]);
[api getLatestHollers:[[[CurrentSession defaultStore]currentUser]userId] completionBlock:^(BOOL succeeded) {
    //If the user has 0 hollers, display one of the illustrations
    [self.tableView reloadData];
    [self stopLoading];
    if( !succeeded ){
        UIAlertView *av = [[UIAlertView alloc] initWithTitle:@"Error" message:@"Could not connect to Holler" delegate:nil cancelButtonTitle:@"OK" otherButtonTitles:nil];
        [av show];
        [av release];
    }
    else
    {
        for( Holler *hN in [[HollerStore defaultStore] allHollers] )
        {
            //Retain count of all the hollers is 
            NSLog(@"Retain count of the holler is %i", [hN retainCount]);
        }
    }
}];

[api release];

Как вы можете видеть, у меня есть закомментированная область, в которой выводится счетчик сохранения для NSLog, который был частью моей отладки.процесс.На данный момент, это говорит мне, что счетчик хранения каждого объекта равен 2, что означает, что оригинальный Holler, сгенерированный в следующем наборе кода, еще не был автоматически выпущен.Следующий набор кода находится в моем реальном веб-сервисе.Я включил комментарии вокруг ключевой части этого метода, что привело к увеличению количества сохранений:

- (void)getLatestHollers: (NSString *)userId completionBlock:(void (^)(BOOL succeeded))handler
{
    [self getRequest:[[NSString alloc]initWithFormat:@"hollers/feed?user_id=%@",userId] completionBlock:^(NSData *receivedData, NSURLResponse *receivedResponse, NSError *error) {
    if( error == nil )
    {
        SBJsonParser *json = [SBJsonParser new];
        NSArray *response = [json objectWithData:receivedData];
        [json release];
        //NSLog(@"Got the latest Hollers. %@", response);
        HollerStore *hStore = [HollerStore defaultStore];
        for( NSDictionary *holler in response )
        {
            //At this point Holler *h is being sent an autoreleased holler
            //from the parseHoller: method.  At this point it's retain count is 1
            Holler *h = [self parseHoller:holler];
            [hStore addHoller:h];
            //Now that I've added it to my singleton the retain count is 2, although I'm 
            //assuming the autorelease pool will eventually come through and reduce this 
            //to 1 but it never happens
        }
        handler(YES);
    }
    else
    {
        NSLog(@"The API failed :(, %@", [error localizedDescription]);
        //Let the requestor know that this request failed
        handler(NO);
    }
    }];
}

В этот момент счет сохранения остается на уровне 2, а не 1, поэтому, когда я иду, чтобы удалить объект измой синглтон, это приводит к утечке памяти.Единственное, что я могу сделать вывод, это то, что у меня возникают какие-то проблемы с памятью, связанные с блоками.Если бы кто-нибудь мог дать какое-то понимание, это было бы очень ценно !!!

1 Ответ

2 голосов
/ 11 августа 2011

Вы никогда не должны использовать retainCount вообще, когда-либо - на самом деле Apple должна просто удалить его из SDK, так как он вообще бесполезен.Проверьте этот вопрос по техническим причинам, почему вы не должны использовать его в упор:

Когда использовать -retainCount?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...