(iphone) Утечки nsInvocation .. может быть, переданные аргументы?

Я вызываю селектор в фоновом потоке,
Вокруг селектора находится NSAutorelasePool.
Я предполагаю, что аргументы, которые я передаю селектору, вызывают проблему. Как мне с этим справиться?

  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];

person eugene    schedule 14.01.2011    source источник


Ответы (2)


Когда вы указываете вызову выполнять вызов в фоновом режиме, создается новый поток с вызовом вызова в качестве первого вызываемого метода. 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];
person ughoavgfhw    schedule 14.01.2011
comment
спасибо, это то же самое, что обернуть селектор пулом? -(void) theSelectorToPerform { NSAutoreleasePool * pool = [NSAutoreleasePool new]; .. код селектора ... [выпуск пула]; } ? - person eugene; 15.01.2011

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

person DougW    schedule 28.10.2011