目标C线程问题

lew*_*sid 4 iphone cocoa-touch objective-c

这是代码:

for(int i = 0; i < personListViewController.peopleCount; i++) {
    [NSThread detachNewThreadSelector:@selector(getPerson:) toTarget:self withObject:i];
}
Run Code Online (Sandbox Code Playgroud)

getPerson看起来像这样:

 - (void)getPerson:(int)whichPerson { }
Run Code Online (Sandbox Code Playgroud)

当我构建它时,我得到以下结果:警告:传递'detachNewThreadSelector:toTarget:withObject:'的参数3使得整数指针没有强制转换

我想要做的就是通过detachNewThreadSelector将一个int传递给getPerson,我无法弄清楚如何让它除了一个对象指针之外的其他东西.我在这里错过了什么?

Bar*_*ark 12

作为第一个参数传递的选择器-[NSThread detachNewThreadSelector:toTarget:withObject:]必须采用一个类型的参数id(指向对象实例的指针).虽然你可以玩游戏的事实是(在大多数平台上),一个指针的大小和一个int类型相同id,然后将你的值转换成一个然后再回到一个int,你不应该依赖这种行为.相反,编写一个包装器方法,该方法接受一个NSNumber参数并将其包装int成一个NSNumber.包装器方法实现可以是:

- (void)getPersonWithNumber:(NSNumber*)number {
  [self getPerson:[number integerValue]];
}
Run Code Online (Sandbox Code Playgroud)

那你的循环就是

for(NSInteger i = 0; i < personListViewController.peopleCount; i++) {
        [NSThread detachNewThreadSelector:@selector(getPersonWithNumber:) toTarget:self withObject:[NSNumber numberWithInteger:i];
}
Run Code Online (Sandbox Code Playgroud)

请注意,我已经从转换intNSInteger整个过程.除非您与使用的遗留代码接口,否则您int应该NSInteger在新的Cocoa代码中使用哪个是每个平台(32位或64位)上适当大小整数的typedef.