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:您可以将号码包装在 anNSNumber中以进行通话。你说你不能这样做,因为你需要改变数字,但你可以拉出一个 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 回答
4

这有点骇人听闻,但这在 ARC 下有效:

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

__bridge关键字将告诉编译器忽略 ARC 下的引用计数,但它需要一个指针,因此您首先必须将 int 强制转换为 C 风格的 void 指针当您的方法收到消息时,它将将该对象指针视为整数。

注意:如果您可以将方法更改为采用 NSNumber 而不是整数,那么这将是“正确的”修复。不幸的是,这并不总是可能的。

于 2014-05-23T20:30:37.510 回答
2

您不能next_int用作 the,withObject:因为它不是对象。

将您的呼叫更改为:

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

编辑:并更改meth2为期望 aNSNumber而不是int.

于 2010-03-28T21:32:06.723 回答