调用将在指向函数的指针上启动 NSThread 的函数

Call a function that will start a NSThread on a pointer to function

我正在尝试在 ObjectiveC 中做一些事情(这远不是我所知道的语言),但我不确定是否可行。

我有一个接口 QAFeatTestCaseBase,它有一个函数可以创建一个线程并在其中启动一个函数,然后等待它完成:

- (void)callInBackground:(id)target selector:(SEL)selector
{  
   NSThread* thread = [[NSThread alloc] initWithTarget:self selector:@selector(selector) object:nil];
   [thread setStackSize: 2*1024*1024];
   [thread start];

   while([thread isFinished] == NO) { usleep(1000); }
   [thread release];
} 

然后我继承它来实现一个特定测试的功能:

@interface Bug8772 : QAFeatTestCaseBase
- (void) testBug8772
{
   [self callInBackground:self selector:@selector(Bug8772)];
}

- (void)Bug8772
{
    // do stuff..
}

但我有一个错误:捕获 NSInvalidArgumentException [NSThread initWithTarget:selector:object:]: 目标未实现选择器 (*** - [Bug8722 选择器])

你能指出我做错了什么吗?或者是否有更好的方法来做到这一点?

selector 已经是一个选择器。不要用 @selector.

包裹它
- (void)callInBackground:(id)target selector:(SEL)selector
{  
    NSThread* thread = [[NSThread alloc] initWithTarget:self selector:selector object:nil];
   [thread setStackSize: 2*1024*1024];
   [thread start];

   while([thread isFinished] == NO) { usleep(1000); }
   [thread release];
}

请注意,NSThread 很难正常工作。我不认为上面的代码会做你想要的。

要获得更好的答案,请查看 Dispatch。 Dispatch 也称为 GCD 或 Grand Central Dispatch。