(iphone) nsInvocation утечки .. может быть, переданные аргументы? - PullRequest
0 голосов
/ 14 января 2011

Я вызываю селектор в фоновом потоке,
Селектор окружен 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];

Ответы [ 2 ]

1 голос
/ 28 октября 2011

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

1 голос
/ 14 января 2011

Когда вы говорите вызову выполнить invoke в фоновом режиме, создается новый поток с invoke, являющимся первым вызванным методом. 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];
...