在Objective-C中,执行选择器的所有方法都是:
- performSelector:withObject:
- makeObjectsPerformSelector:withObject:
- performSelectorInBackground:withObject:
并且只能在参数中使用id(指针)对象?你知道为什么吗 ?是继承自C的东西,使用线程我们需要一个指针吗?
编辑:在Objective-C中,我们无法直接创建指针。如果我想用指针做下面的事情,这是否有效? (我知道NSNumber和NSValue类,但我只是想了解它是如何工作的)
int i = 5;
int *pointer_i = &i;
[self performSelector:mySelector withObject:pointer_i];
答案 0 :(得分:3)
您只能将指针作为参数,因此Objective-c对象。如果要使用整数,请尝试:
int i;
[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]];
答案 1 :(得分:2)
你可以施放withObject:(id)pointer_i
,但这是一个坏主意
在此特定实例中,withObject:
的参数为retain
。如果您传入int *
方法所期望的id
,则您的程序会崩溃,因为它正在尝试retain
int
!
答案 2 :(得分:1)
因为id是指向任何类型对象的指针。所以你不需要知道你得到了什么类型的对象(NSString,NSArray)。 id可以指向任何内容。
答案 3 :(得分:0)
基本上你可以传入任何单个对象(它本身可以是数组或字典,如果你需要那种灵活性,但是你需要能够在你调用的函数中传递它,当然。
我离开这个答案的原因是,提到一个陷阱,这使我在使用它时遇到了数小时的挫败感。如果你在选择器名称之后省略冒号,应用程序将编译,但它将在运行时崩溃。
使用前面的例子
[self performSelector:@selector(mySelector:) withObject:[NSNumber numberWithInt:i]];
“mySelector:”需要冒号。
好吧,也许这是一个小东西,对于硬核编码器来说很明显,但我花了很多时间来调试它。如果您的代码崩溃并且您传递的对象有效,则可能选择器不是。