2013-01-15 75 views
0

有沒有辦法抑制編譯錯誤? 我不能在這種情況下使用協議,因爲我試圖使用的類是在外部庫中。我沒有對代碼沒有控制Objective-C - 避免編譯錯誤?

if (myClass && [[myClass class] respondsToSelector:@selector(getSomething)]) 
{ 
    // Compile error on the line below 
    MyResult *result = [myClass getSomething]; 

    // Also tried 
    MyResult *result = [(id)myClass getSomething]; 

} 

編輯: 錯誤:選擇沒有已知的類方法

+0

GDB和LLDB是調試器,而不是編譯器。 Apple支持的編譯器是GCC和Clang。 – zneak

+0

lldb&gdb與編譯有什麼關係?除此之外,什麼是錯誤? –

+0

你有什麼錯誤? – zneak

回答

1

當非類型化Objective-C的對象上使用的方法,編譯器試圖猜測哪些方法,因爲它需要根據返回值生成不同的代碼。代碼的生成方式也不同,具體取決於您是否使用ARC,編譯器需要相應更改。

如果沒有ARC,編譯器將假定返回類型是id,它對於任何它不知道的選擇器都會產生警告。使用ARC,它會變成一個硬錯誤,因爲編譯器不想冒內存管理的機會。

這就是爲什麼你至少需要告訴編譯器一個現有的方法聲明。

+0

另一種解決方案是使用該方法聲明一個類別; '@interface SomeClass(MethodsThatExistThatAreNotDeclaredThisIsBadCodeAndIFeelBad)decl @ end'在需要它的'.m'文件的頂部。 – bbum

0

本文介紹如何使用的#pragma聲明,以避免你在哪裏某些情況下,編譯器警告警告是假陽性(或一個你認爲是安全的忽略):NSHipster - #pragma

+0

這在這種情況下不是誤報。 – bbum

+0

是的。我添加了一個括號來闡明我的意圖。 –