No matching function for call to ‘objc_msgSend’

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

就能直接跳過這問題,不過還是建議更改成符合新版標準的方式比較不會有問題。