0

バックグラウンド スレッドで
セレクターを呼び出しています。セレクターには 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];
4

2 に答える 2

1

ughoavgfhw が言ったことに加えて、オブジェクトを引数として設定してバックグラウンド スレッドに渡す場合は、[anInvocation preserveArguments] を呼び出す必要もあります。

于 2011-10-28T18:21:17.613 に答える
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];
于 2011-01-14T07:56:51.640 に答える