2010-08-27 6 views
0

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


@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

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

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

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