当我尝试在id类型的对象上调用方法时,我收到警告(找不到方法)。当然不是,但这不是id对象的意义吗?
有没有办法告诉编译器:
“你现在不是我称之为这种方法的对象的类,但不要担心,我确定它确实实现了它!”?
答案 0 :(得分:8)
您可以使用performSelector
?
如果您有一个对象类型id
,那么使用respondsToSelector
也是个好主意:)
即。
if ([myObject respondsToSelector:@selector(dosomething:)])
myObject performSelector:@selector(doSomething:) withObject:@"hello"];
答案 1 :(得分:4)
是的,只需使用正确类类型的变量即可。您可以在发送消息时执行显式强制转换,也可以将其分配给正确类型的变量。在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];
答案 2 :(得分:1)
您可以将id
对象投射到您知道它的类。
如果您有一个名为id
的{{1}}个实例,并且您知道它是instanceA
,则会相应地将其投射
ClassA
然后调用方法
Class A *instanceACasted = (ClassA *)instanceA;