我在传递一个数字作为方法的参数时遇到了一些麻烦:
- (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
没有用,因为它是不可变的,我需要不断更改值。
不知道怎么办?
感谢。
答案 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
。