2009-07-22 176 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!

希望有所幫助。