2011-10-22 41 views
2

我在Objective-C編寫的OpenStruct克隆,使用forwardInvocation:。但是,編譯器在編譯時顯然沒有意識到轉發。使用ARC進行編譯會帶來很多警告。使用ARC訪問forwardInvocation的方法?

的代碼是開源的,可在Github,但目前與-fno-objc弧編譯。如果任何人都可以看看我如何使ARC兼容,我將不勝感激。

+0

如果您發佈了至少一個錯誤和編譯器遇到問題的相應代碼,它將會有所幫助。 – LearnCocos2D

+1

不可能做你想做的事情。編譯器需要在編譯時知道方法簽名,並且如果它不知道它們就會抱怨。 –

回答

3

我試過這段代碼:

OpenStruct *myStruct = [[OpenStruct alloc] initWithDictionary:myDictionary]; 
NSLog(@"%@ says %@", @"Cow", [myStruct cowSound]); 

我得到警告或錯誤使用和不使用ARC,與LLVM 3.0或LLVM GCC 4.2。我認爲你誤解了forwardInvocation:仍然需要在某個級別聲明該方法,如果僅在你發送消息的類的類別(@interface)中。

例如,當你這樣做:

[someObject doSomething]; 

,那麼這將始終產生至少一個警告(「someObject可能不DoSomething的迴應」)如果DoSomething的不被任何聲明,無論是否someObject類是否實現forwardInvocation。就像你注意到的那樣,編譯器確實沒有意識到轉發,也不能確定你的forwardInvocation的實現保證了消息的傳遞。使用帶有或不帶AR​​C的LLVM 3.0可能會改變這個錯誤,因爲ARC的開發目標是在更多編譯器錯誤而不是運行時問題上犯錯。

現在,你仍然可以發送郵件到一個對象沒有實現的方法。例如通過使用Objective-C運行時方法objc_msgSend或通過NSInvocation。但是這樣會使您打算創建的簡單易用界面變得無效。

順便說一句,對於OpenStruct您的使用例子並沒有真正證明爲什麼它是任何簡單的訪問通過短信動態結構比較簡單的存取像[結構getValueForKey:@「哞哞」]; ...如果你認爲這一點[結構moo]給用戶很少或根本沒有利益的第一種方法。 「moo」方法是動態的(字符串或轉發的消息),並且在運行時不會捕獲錯字。

+0

好處就是代碼更小。我認爲這更重要。 [牛聲]馬上說你對牛的聲音很感興趣。 – wjl

+0

當然,但你可以用一種健全的方法寫一個牛類,對吧?或者,更好的是,實現聲音方法的Animal類和聲音文件名可以在init中或通過屬性設置。所有其他類,如牛,青蛙,翼手龍繼承動物,並可以隨後播放聲音。 – LearnCocos2D

+0

我正在考慮的用例是用於CMS的界面。內容將由Web應用程序管理。 iOS應用程序將同步到它。無法預先定義iOS代碼中的所有潛在字段,因爲用戶可以通過Web界面隨意添加和刪除它們。與使用屬性語法相比,使用字典或鍵值編碼是笨拙的語法和大量的鍵入。 – Jim