web-dev-qa-db-ja.com

メソッド引数のオブジェクトとしてのIntまたはNSInteger。 Objective-C

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

- (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でも同じように発生します。 NSNumberは不変であり、値を絶えず変更する必要があるため、役に立ちません。どうすればこれを行うことができますか?

ありがとう。

13
sergiobuj

メソッドを呼び出そうとしているだけの場合は、標準の構文を使用できます。

[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として宣言されていません)。

また、覚醒剤はあなたに悪いです!ハハ

23
Tyler

整数を渡す前に、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
}
6
indragie

ちょっとしたハックですが、これはARCで機能します。

int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:) 
                       withObject:(__bridge id)(void*)next_int 
                    waitUntilDone:NO];

__ bridgeキーワードは、ARCでの参照カウントを無視するようコンパイラーに指示しますが、ポインターが必要なため、最初にintをCスタイルにキャストする必要があります。ボイドポインタ。メソッドがメッセージを受信すると、そのオブジェクトポインタを整数であるかのように扱います。

注:canメソッドを変更して、整数ではなくNSNumberを取得する場合、それは「適切な」修正になります。残念ながら、それが常に可能であるとは限りません。

3
Anthony F

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

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

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

編集:そして、meth2を変更して、NSNumberではなくintを期待します。

2
David Gelhar