Почему нет пула автоматического выпуска, когда я выполняюSelectorInBackground - PullRequest
5 голосов
/ 30 мая 2009

Я вызываю метод, который идет в фоновом потоке:

[self performSelectorInBackground:@selector(loadViewControllerWithIndex:) withObject:[NSNumber numberWithInt:viewControllerIndex]];

тогда у меня есть реализация этого метода, которая вызывается селектором:

- (void) loadViewControllerWithIndex:(NSNumber *)indexNumberObj {
    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];
    NSInteger vcIndex = [indexNumberObj intValue];

    Class c;
    UIViewController *controller = [viewControllers objectAtIndex:vcIndex];

    switch (vcIndex) {
        case 0:
            c = [MyFirstViewController class];
            break;
        case 1:
            c = [MySecondViewController class];
            break;
        default:
            NSLog(@"unknown index for loading view controller: %d", vcIndex); // error
            break;
    }

    if ((NSNull *)controller == [NSNull null]) {
        controller = [[c alloc] initWithNib];
        [viewControllers replaceObjectAtIndex:vcIndex withObject:controller];
        [controller release];
    }

    if (controller.view.superview == nil) {
        UIView *placeholderView = [viewControllerPlaceholderViews objectAtIndex:vcIndex];
        [placeholderView addSubview:controller.view];
    }

    [arPool release];
}

Несмотря на то, что я создаю пул автоматического выпуска для этого потока, я всегда получаю эту ошибку:

2009-05-30 12:03:09.910 Demo[1827:3f03] *** _NSAutoreleaseNoPool(): Object 0x523e50 of class NSCFNumber autoreleased with no pool in place - just leaking
Stack: (0x95c83f0f 0x95b90442 0x28d3 0x2d42 0x95b96e0d 0x95b969b4 0x93a00155 0x93a00012)

Если я заберу пул авто-релиза, я получу целую кучу таких сообщений. Я также попытался создать пул автоматического выпуска вокруг вызова executeSelectorInBackground:, но это не помогло.

Я подозреваю, что параметр, но я не знаю, почему компилятор жалуется на NSCFNumber. Я что-то упустил?

Все переменные моего экземпляра являются "неатомными". Может ли это быть проблемой?

ОБНОВЛЕНИЕ: Я также могу подозревать, что некоторая переменная была добавлена ​​в пул автоматического выпуска основного потока (возможно, ivar), и теперь она пытается освободить ее в неправильном пуле автоматического выпуска? Если так, как я мог это исправить? (блин, этот многопоточный материал сложен;))

Ответы [ 2 ]

6 голосов
/ 30 мая 2009

Скорее всего, причина этого в том, что утечка объекта (NSNumber) является параметром, передаваемым извне потока. Следовательно, эта переменная принадлежит вызывающему потоку (и его пулу автоматического выпуска)

Причина, по которой пул автоматического выпуска вокруг вызова потока не работает, заключается в том, что создатель потока (executeSelectorInbackground) - возвращает немедленно, скорее всего, пока поток еще работает.

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

2 голосов
/ 12 июня 2010

Я согласен, что, скорее всего, причина этого в том, что утечка объекта (NSNumber) является параметром, передаваемым извне потока. Следовательно, эта переменная принадлежит вызывающему потоку (и его пулу автоматического выпуска)

вызывающий поток должен использовать NSAutoreleasePool и я предлагаю добавить в свой параметр инструкцию сохранения как:

- (void) loadViewControllerWithIndex:(NSNumber *)indexNumberObj {
    NSAutoreleasePool *arPool = [[NSAutoreleasePool alloc] init];
    [indexNumberObj retain];

    ....

    [arPool release];
  }
...