Int或NSInteger作为方法参数的对象.Objective-C的

ser*_*buj 13 iphone objective-c nsinteger

我在传递一个数字作为方法的参数时遇到了一些麻烦:

- (void)meth2:(int)next_int;
Run Code Online (Sandbox Code Playgroud)

要调用该方法,我需要这个:

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

在这一点上,我得到一个"没有强制转换的整数指针"错误,并且会发生相同的情况NSInteger.一个NSNumber没用,因为它是不可变的,我需要不断更改值.知道我该怎么办?

谢谢.

Tyl*_*ler 23

如果您只是尝试调用该方法,则可以使用标准语法:

[self meth2:next_int];
Run Code Online (Sandbox Code Playgroud)

如果你真的需要使用它,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
}
Run Code Online (Sandbox Code Playgroud)

但也许你的意思是你希望得到号码的值作为你的电话的输出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];
Run Code Online (Sandbox Code Playgroud)

当然,这不是真正的线程安全,所以如果你正在做多线程的东西,我建议使用@synchronized关键字来访问多线程访问的变量,或者设置原子属性(即未声明为的属性nonatomic).

而且,甲基对你不好!! 哈哈


ind*_*gie 6

在传递之前将整数包装在NSNumber中:

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

然后你的-meth2:方法看起来像这样:

- (void)meth2:(NSNumber*)theNumber
{
    int next_int = [theNumber intValue];
    // do whatever
}
Run Code Online (Sandbox Code Playgroud)