2009-07-22 94 views
4

下面的代码:目标C线程问题

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

getPerson看起来是这样的:

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

当我建立这个,我得到如下:警告:传递detachNewThreadSelector的”说法三: toTarget:withObject:'使指针从整数没有铸造

我想要做的就是通过一个int传递给getPerson通过detachNewThrea dSelector和我无法弄清楚如何让它采取任何东西,但对象指针。我在这里错过了什么?

回答

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。

+0

这样做。谢谢你一百万次。在objective-c中,我经常会遇到那些小事情。 – lewsid 2009-07-22 17:14:01

4

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

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

NSThread不采用原语(如int或char),所以你必须使用NSNumber!

希望有所帮助。