目标C线程问题

时间:2009-07-22 17:03:11

标签: iphone objective-c cocoa-touch

以下是代码:

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

getPerson看起来像这样:

 - (void)getPerson:(int)whichPerson { }

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

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

2 个答案:

答案 0 :(得分:12)

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

- (void)getPersonWithNumber:(NSNumber*)number {
  [self getPerson:[number integerValue]];
}

你的循环将是

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

请注意,我已经从int转换为NSInteger。除非您与使用int的遗留代码接口,否则应使用NSInteger,它是新Cocoa代码中每个平台(32位或64位)上相应大小整数的typedef。

答案 1 :(得分:4)

您需要将整数包装在NSNumber类中,以使该数字成为对象。

[NSThread detachNewThreadSelector:@selector(getPerson:) toTarget:self withObject:[NSNumber numberWithInteger:i]];

NSThread不接受基元(如int或char),因此必须使用NSNumber!

希望有所帮助。