NSInvocation Утечки - PullRequest
       13

NSInvocation Утечки

0 голосов
/ 27 августа 2010

Я пытаюсь настроить систему NSInovcation для запуска селекторов в фоновые потоки с использованием executeSelectorInBackground: - Пока все успешно, когда система запускается на экземплярах методов (-), но я также хочу поддерживать методы класса (+). Я изменил свой код, чтобы обеспечить invokeInBackgroundThread для обоих типов классов, и все работало, за исключением одной проблемы. Когда методы класса вызываются, моя консоль заполняется сообщениями "autoreleased with no pool on place". Понятия не имею, что вызывает это. Код, основанный на проекте с открытым исходным кодом DDFoundation, показан ниже.


@implementation NSObject (DDExtensions)
...
+ (id)invokeInBackgroundThread
{
    DDInvocationGrabber *grabber = [DDInvocationGrabber invocationGrabber];
    [grabber setInvocationThreadType:INVOCATION_BACKGROUND_THREAD];
    return [grabber prepareWithInvocationTarget:self];
}

- (id)invokeInBackgroundThread
{
    DDInvocationGrabber *grabber = [DDInvocationGrabber invocationGrabber];
    [grabber setInvocationThreadType:INVOCATION_BACKGROUND_THREAD];
    return [grabber prepareWithInvocationTarget:self];
}
...

...
- (void)forwardInvocation:(NSInvocation *)ioInvocation
{
    [ioInvocation setTarget:[self target]];
    [self setInvocation:ioInvocation];

 if (_waitUntilDone == NO) {
  [_invocation retainArguments];
 }

    if (_threadType == INVOCATION_MAIN_THREAD)
    {
        [_invocation performSelectorOnMainThread:@selector(invoke)
                                      withObject:nil
                                   waitUntilDone:_waitUntilDone];
    } else {
        [_invocation performSelectorInBackground:@selector(invoke)
                                  withObject:nil];
 }
}
...

+(void)doSomething;
[[className invokeOnBackgroundThread] doSomething];

1 Ответ

1 голос
/ 27 августа 2010

Основной поток по умолчанию имеет пул автоматического выпуска, если вы запускаете дополнительный поток - это ваша задача создать пул. На самом деле ничего сложного здесь нет, просто

NSAutoreleasePool* pool = [[NSAutoreleasePool alloc] init];
// Work...
[pool release];

Кроме того, если у вас много потоков, я бы посоветовал вам взглянуть на NSOperation вместо запуска потоков с [executeSelectorInBackground]. NSOperation (с очередью переноса) является более гибким решением для таких задач.

...