14

メソッドの引数として数値を渡すのに問題があります。

- (void)meth2:(int)next_int;

そして、そのメソッドを呼び出すには、これが必要です:

int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:) withObject:next_int waitUntilDone:NO];
//update next_int and call meth2 again

この時点で、「キャストなしの整数からのポインター」エラーが発生し、NSInteger. AnNSNumberは不変であり、常に値を変更する必要があるため、役に立ちません。どうすればこれを行うことができますか?

ありがとう。

4

4 に答える 4

23

メソッドを呼び出すだけの場合は、標準の構文を使用できます。

[self meth2:next_int];

本当に を使用する必要がある場合は、電話performSelectorOnMainThread:番号を で囲むことができNSNumberます。数値を変更する必要があるため、これを行うことはできないと言いますが、int を取り出して変更するだけです。

[self performSelectorOnMainThread:@selector(meth2:) withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];
// ... later ...
- (void)meth2:(NSNumber *)number {
  int myInt = [number intValue];
  // do stuff with myInt
}

しかし、 への呼び出しからの出力として数値の値を取得したいということかもしれませんmeth2。それがあなたの言いたいことなら、新しいオブジェクトを受け取ることができるように、二重ポインターを渡すことができます。

- (void)meth2:(NSNumber **)number {
  int myInt = [*number intValue];
  // do stuff with myInt
  *number = [NSNumber numberWithInt:myInt];
}
// The caller can now operate like this:
NSNumber *number = [NSNumber numberWithInt:next_int];
[self performSelectorOnMainThread:@selector(meth2:) withObject:&number waitUntilDone:YES];
int returnInt = [*number intValue];

もちろん、それは実際にはスレッド セーフではないので、複数のスレッドで処理を行っている場合は、@synchronizedキーワードを使用してマルチスレッド アクセス変数にアクセスするか、アトミック プロパティ (つまり、 として宣言されていないプロパティ) を設定することをお勧めしますnonatomic

また、覚せい剤は体に悪いです!! 笑

于 2010-03-28T21:41:22.800 に答える
6

渡す前に整数を NSNumber でラップします。

int next_int = 1
NSNumber *theNumber = [NSNumber numberWithInt:next_int];
[self performSelectorOnMainThread:@selector(meth2:) withObject:theNumber waitUntilDone:NO];

次に、 -meth2: メソッドは次のようになります。

- (void)meth2:(NSNumber*)theNumber
{
    int next_int = [theNumber intValue];
    // do whatever
}
于 2010-03-28T21:32:31.827 に答える
2

オブジェクトではないためnext_int、として使用できません。withObject:

通話を次のように変更します。

[self performSelectorOnMainThread:@selector(meth2:) 
      withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];

編集:の代わりにmeth2を期待するように変更します。NSNumberint

于 2010-03-28T21:32:06.723 に答える