(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 е първият извикан метод. 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 retainArguments], ако възнамерявате да зададете обекти като аргументи и да преминете към фонова нишка.

person DougW    schedule 28.10.2011