No matching function for call to ‘objc_msgSend’
將Project轉至Xcode 6 beta時發生 No matching function for call to ‘objc_msgSend’ 的問題,其實這是因應 64bit時代來臨,編譯器在編譯時需要清楚的知道型別,避免64bit vs 32bit轉換上發生與預期的不同,所以在WWDC 2014中,Apple以 Strict Checking of objc_msgSend 做為標題來解說,在使用 objc_msgSend
時要先宣告你傳入的類型後方能使用,原本要傳的method如下:
//-----------start----------- (void)setAudio:(NSNumber*) isHeadset //------------end------------
原本在C++/C中所使用的如下:
//-----------start----------- objc_msgSend(THIS->parent, @selector(setAudio:), isHeadset); //------------end------------
THIS->parent(AObject) 為 setAudio所在的物件指標,其物件為 AObject
類別,並且setAudio無回傳值,所以現在需要將型別利用typedef
來處理過:
//-----------start----------- typedef void (*send1)(AObject *, void*, NSNumber *); send1 func1 = (send1)objc_msgSend; //------------end------------
之後直接使用func1
當做function來使用:
//-----------start----------- func1(THIS->parent, @selector(setAudio:), isHeadset); //------------end------------
最後擷錄 WWDC 2014 What’s New in LLVM Session 417 中所提到的事項:
清楚的告訴我們在Xcode6的LLVM 6.0已經做了很多改變,objc_msgSend
只是其中之一,如果你真的想要跳過這個錯誤,那可以試著將原本預設值的:
改成 NO
就能直接跳過這問題,不過還是建議更改成符合新版標準的方式比較不會有問題。