2011-07-29 18 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

相關問題