当我试图调用id类型的对象的方法时,我得到了一个警告(未找到方法)。当然不是,但是这不是一个id对象的意义吗?对id类型的对象调用方法
有没有办法来告诉编译器:
“你现在不类的对象上,我正在调用该方法,但不要担心,我敢肯定它确实实现了! “?
当我试图调用id类型的对象的方法时,我得到了一个警告(未找到方法)。当然不是,但是这不是一个id对象的意义吗?对id类型的对象调用方法
有没有办法来告诉编译器:
“你现在不类的对象上,我正在调用该方法,但不要担心,我敢肯定它确实实现了! “?
你可以使用performSelector
?
如果你已经有了一个对象类型id
它可能使用respondsToSelector
以及:)
即
if ([myObject respondsToSelector:@selector(dosomething:)])
myObject performSelector:@selector(doSomething:) withObject:@"hello"];
您可以将您的id
对象转换为您知道它的类。
如果你有一个id
实例名为instanceA
,你知道它是ClassA
你施放它相应
Class A *instanceACasted = (ClassA *)instanceA;
然后调用方法
[instanceACasted methodCall];
是的,只要使用适当的类类型的变量是一个好主意。您可以在发送消息时执行显式强制转换,也可以将其分配给正确类型的变量。在Objective-C,类型id
可以隐式转换为任何Objective-C的对象指针类型:
id myId = ...;
// Option 1: Use a cast when sending the message
[(MyClass *)myId someClassMethod];
// Option 2: Assign to a variable
MyClass *myObj = miId; // Implicit cast in the assignment
[myObj someClassMethod];
谢谢你,最后我得到了什么隐含的铸造是:) – bijan
只有当方法采用对象类型的0-2个参数时才有效。如果该方法需要多于2个参数,或者如果任何参数是基本类型,那么这将不起作用。 –
好的,看看NSInvocation;) – deanWombourne
我认为这是在我的情况下(1参数,许多潜在的接收器类型)的方式! – bijan