2010-03-28 62 views
12

我遇到了一些麻烦传递一个数字作为参数的方法:Int或NSInteger作为方法参数的对象。 Objective-C的

- (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是没有用的,因为它是不可变的,我需要不断地改变它的值。 任何想法我怎么能做到这一点?

谢谢。

回答

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

此外,meth对你不好!哈哈

+0

您好泰勒,我不确定关于@synchronized关键字,我会阅读,但因为这整型变量被用作线程的'输出',不需要担心并发和东西。 ..withObject:[NSNumber numberWithInt:next_int] ..效果很好,(NSNumber **)给了我一个不兼容的指针类型警告。 我会记住,关于meth ...谢谢! – sergiobuj 2010-03-28 22:13:40

2

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

你的电话更改为:

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

编辑: 和更改meth2期待一个NSNumber而不是int

+1

这将导致运行时崩溃,因为您还需要修改方法签名以获取'NSNumber' – 2010-03-28 21:38:35

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 
} 
3

这是一个黑客攻击的一位,但这个工程下ARC:

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

__bridge关键字会告诉编译器忽略ARC下引用计数,但它需要一个指针,所以你先必须将int转换为C样式void指针。当你的方法接收到消息时,它会将该对象指针看作是一个整数。

注意:如果你可以更改方法采取一个NSNumber而不是一个整数,那么这将是“适当”的修复。不幸的是,这并不总是可能的。

+0

如果你想传递一个枚举,比如设置一个枚举属性,这是一个不错的诀窍;例如'[cell performSelector:@selector(setSortOrder :) withObject:(__ bridge id)(void *)order];' – tiritea 2016-07-26 04:27:34

相关问题