以下是代码:
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,我无法弄清楚如何让它除了一个对象指针之外的任何东西。我在这里缺少什么?
答案 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!
希望有所帮助。