2012-10-08 52 views
1

我使用MagicalRecord(這是NSManagedObject的一個類別)來獲取我的模型。然後我使用一個通用的表格視圖控制器來顯示它們,並根據類名顯示我的數據。客觀c類類型檢查

的問題是,當我想取這些數據我用的是這樣的:

Class type = NSClassFromString(modelName); 
NSArray *model = [type MR_findAll]; 

這編譯和完美運行,節選的是Xcode中顯示討厭的錯誤:「爲MR_findALL不知道類的方法」 。

我可以做類似於NSManagedObject的「類轉換」,這樣錯誤就會消失嗎?我想保持動態,我不想爲我的所有模型定義條件。

+0

只要忽略這個噪音。 – 2012-10-08 16:07:37

回答

0

定義包含MR_findAll的協議。在撥打電話之前將您的對象轉換爲該協議。

[(id<FindAllProtocol>)type MR_findAll]

+0

完美謝謝! – Fred

+0

這不是問題。你會發現聲明你的協議,但刪除'(id ),仍然可以解決這個問題。 – newacct

-2

嘗試將您的類型變量轉換爲id,這是一種動態類型。

+0

它運行良好,但它仍然有相同的錯誤。 – Fred

+0

@iSofTom這不是問題。 – 2012-10-08 16:35:44

+0

這不是問題所在。 'Class'已經禁用靜態類型檢查,就像'id' – newacct

2

的問題不是靜態類型檢查。 Class,如id,禁用靜態類型檢查。

的問題是別的東西:在Objective-C,以發送郵件使用[... ...]語法的消息時,編譯器必須首先看到這樣的方法某處的聲明。編譯器需要聲明的原因是,編譯器必須將消息調度編譯爲幕後的objc_msgSendobjc_msgSend_stret調用。哪一個取決於方法的返回類型。因此,它必須知道方法的類型(來自聲明)以編譯對它的調用。

請注意,我說「某處」,因爲「某處」可能與您使用它的地方完全無關。您可以聲明一個虛擬協議,其中包含相同消息的聲明,從未在任何地方使用,它將用於聲明的目的。或者你可以聲明一個包含它的類別。隨你。這對你來說可能看起來很不可思議。但是,如果您採用協議@ @ HotLicks的解決方案,並刪除轉換,它仍然不會有警告,因爲協議是否被使用並不重要 - 這是與此相關的聲明。

+0

你是對的演員是無用的。有時候很難掌握objc的動態性質。非常感謝,這是該語言非常有趣的一個方面。 – Fred