2009-07-22 13 views
4

は、ここでは、コードです:Objective Cのスレッド質問

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

getPersonは、次のようになります警告:detachNewThreadSelector」の引数渡し3

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

私はこれをビルドすると、私は以下のようになります。 toTarget:withObject: 'キャストのない整数からポインタを作成する

私がやりたいことは、detachNewThrea経由でgetPersonにintを渡すことです。 dSelectorと私は、オブジェクトポインタ以外のものを取るためにどのようにそれを取得するために一体どのように把握することはできません。私はここで何が欠けていますか?

答えて

12

-[NSThread detachNewThreadSelector:toTarget:withObject:]の最初の引数として渡すセレクタは、タイプid(オブジェクトインスタンスへのポインタ)の1つの引数を取る必要があります。ほとんどのプラットフォームでは、ポインターはintと同じサイズで、値をidにキャストしてからintにキャストしてゲームをプレイすることはできますが、この動作に頼るべきではありません。代わりに、NSNumber引数を取り、intNSNumberにラップするラッパーメソッドを記述します。ラッパー・メソッドの実装は次のようになります。

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

あなたのループが、私は全体intからNSIntegerに変換しました

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

注だろう。 intを使用するレガシーコードとインターフェイスしている場合を除き、NSIntegerを使用する必要があります。これは、新しいCocoaコードの各プラットフォーム(32または64ビット)で適切なサイズ整数のtypedefです。

+0

これはそのトリックでした。何百万回もありがとうございました。客観的に私を連れて行くのはいつも小さなものです。 – lewsid

4

数値をオブジェクトにするには、整数をNSNumberクラスにラップする必要があります。

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

NSThreadは、(intやcharのような)プリミティブを取らないため、NSNumberを使用する必要があります。

希望に役立ちます。