2011-07-29 17 views
1

当我试图调用id类型的对象的方法时,我得到了一个警告(未找到方法)。当然不是,但是这不是一个id对象的意义吗?对id类型的对象调用方法

有没有办法来告诉编译器:
“你现在不类的对象上,我正在调用该方法,但不要担心,我敢肯定它确实实现了! “

回答

8

你可以使用performSelector

如果你已经有了一个对象类型id它可能使用respondsToSelector以及:)

if ([myObject respondsToSelector:@selector(dosomething:)]) 
    myObject performSelector:@selector(doSomething:) withObject:@"hello"]; 
+0

只有当方法采用对象类型的0-2个参数时才有效。如果该方法需要多于2个参数,或者如果任何参数是基本类型,那么这将不起作用。 –

+0

好的,看看NSInvocation;) – deanWombourne

+0

我认为这是在我的情况下(1参数,许多潜在的接收器类型)的方式! – bijan

1

您可以将您的id对象转换为您知道它的类。

如果你有一个id实例名为instanceA,你知道它是ClassA你施放它相应

Class A *instanceACasted = (ClassA *)instanceA; 

然后调用方法

[instanceACasted methodCall]; 
+0

是的,但它并不总是相同的类!实际上,它总是ViewController的子类,所以我可以使用ViewController进行投射。但是在“松耦合”方面,没有更好的方法吗? – bijan

+0

然后你可以使用if([instanceA isKindOfClass:[ClassA class]]){// cast and call method}; –

+0

对,isKindOfClass也是一个很好的可能性。谢谢! – bijan

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]; 
+0

谢谢你,最后我得到了什么隐含的铸造是:) – bijan

相关问题