为什么performSelector:withObject:方法只能带id?

时间:2011-03-21 13:46:44

标签: iphone objective-c c ios pointers

在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];

4 个答案:

答案 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:”需要冒号。

好吧,也许这是一个小东西,对于硬核编码器来说很明显,但我花了很多时间来调试它。如果您的代码崩溃并且您传递的对象有效,则可能选择器不是。