當我試圖調用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