2011-01-14 5 views
0

Я вызываю селектор на фоновом потоке,
Селектор имеет NSAutorelasePool вокруг него.
Я думаю, что аргументы, которые я передаю селектору, вызывают проблему. Как мне с этим справиться?(iphone) nsInvocation утечки .. возможно, прошедшие аргументы?

SEL theSelector; 
    NSMethodSignature *aSignature; 
    NSInvocation *anInvocation; 

    theSelector = @selector(changeColor:forColorString:); 
    aSignature = [[animationData class] instanceMethodSignatureForSelector:theSelector]; 
    anInvocation = [NSInvocation invocationWithMethodSignature:aSignature]; 
    [anInvocation setSelector:theSelector]; 
    [anInvocation setTarget:animationData]; 
    // indexes for arguments start at 2, 0 = self, 1 = _cmd                                                     
    [anInvocation setArgument:&currentColor atIndex:2]; 
    [anInvocation setArgument:&nsColorString atIndex:3]; 

    [anInvocation performSelectorInBackground:@selector(invoke) withObject:NULL]; 

ответ

1

Когда вы указываете вызов для выполнения вызова в фоновом режиме, новый поток создается с вызовом, вызывающим первый вызванный метод. Invoke не создает пул авторезистов, поэтому все автореализованные во время этого метода будут просочиться.

Чтобы исправить это, используйте метод оболочки для выполнения вызова.

- (void)performInvocation:(NSInvocation *)anInvocation { 
    NSAutoreleasePool *pool = [NSAutoreleasePool new]; 
    [anInvocation invoke]; 
    [pool release]; 
} 

//where you were performing the invoke before: 
[self performSelectorInBackground:@selector(performInvocation:) withObject:anInvocation]; 
+0

спасибо, это то же самое, что и селектор упаковки с пулом? - (void) theSelectorToPerform {NSAutoreleasePool * pool = [NSAutoreleasePool new]; .. селекторный код ... [пул релиз]; }? – eugene

1

В дополнение к тому, что ughoavgfhw сказал, вы должны позвонить [anInvocation retainArguments], если вы собираетесь установить объекты в качестве аргументов и перейти в фоновый поток.

 Смежные вопросы

  • Нет связанных вопросов^_^