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

时间:2010-03-28 21:25:46

标签: iphone objective-c nsinteger

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

- (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没有用,因为它是不可变的,我需要不断更改值。 不知道怎么办?

感谢。

4 个答案:

答案 0 :(得分:22)

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

[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的属性)。

另外,甲基对你不好!!哈哈

答案 1 :(得分: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
}

答案 2 :(得分:3)

这有点像黑客攻击,但这可以在ARC下运行:

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

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

注意:如果您可以更改方法以获取NSNumber而不是整数,那么这将是"正确的"固定。不幸的是,这并不总是可行的。

答案 3 :(得分:2)

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

将您的电话改为:

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

编辑: 并将meth2更改为NSNumber而不是int