メソッドの引数として数値を渡すのに問題があります。
- (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
は不変であり、値を絶えず変更する必要があるため、役に立ちません。どうすればこれを行うことができますか?
ありがとう。
メソッドを呼び出そうとしているだけの場合は、標準の構文を使用できます。
[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
として宣言されていません)。
また、覚醒剤はあなたに悪いです!ハハ
整数を渡す前に、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
}
ちょっとしたハックですが、これはARCで機能します。
int next_int = 1;
[self performSelectorOnMainThread:@selector(meth2:)
withObject:(__bridge id)(void*)next_int
waitUntilDone:NO];
__ bridgeキーワードは、ARCでの参照カウントを無視するようコンパイラーに指示しますが、ポインターが必要なため、最初にintをCスタイルにキャストする必要があります。ボイドポインタ。メソッドがメッセージを受信すると、そのオブジェクトポインタを整数であるかのように扱います。
注:canメソッドを変更して、整数ではなくNSNumberを取得する場合、それは「適切な」修正になります。残念ながら、それが常に可能であるとは限りません。
next_int
はオブジェクトではないため、withObject:
として使用することはできません。
通話を次のように変更します。
[self performSelectorOnMainThread:@selector(meth2:)
withObject:[NSNumber numberWithInt:next_int] waitUntilDone:NO];
編集:そして、meth2
を変更して、NSNumber
ではなくint
を期待します。