目标c类型检查

时间:2012-10-08 16:06:47

标签: objective-c class

我使用MagicalRecord(这是NSManagedObject的一个类别)来获取我的模型。然后我使用通用表视图控制器显示它们,它根据类名显示我的数据。

问题在于,当我想获取这些数据时,我会使用以下内容:

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

这完全编译运行,除了xcode显示一个令人讨厌的错误:“没有知道MR_findALL的类方法”。

我可以对NSManagedObject执行类似“类强制转换”的操作,这样错误就会消失吗?我希望保持动态,我不想为我的所有模型定义条件。

3 个答案:

答案 0 :(得分:2)

问题不在于静态类型检查。 Classid一样,禁用静态类型检查。

问题是另一回事:在Objective-C中,为了使用[... ...]语法发送消息,编译器必须首先看到这样的方法声明某处。编译器需要声明的原因是编译器必须将消息调度编译为幕后的objc_msgSendobjc_msgSend_stret调用。哪一个取决于方法的返回类型。因此,它必须知道方法的类型(来自声明)才能编译对它的调用。

注意,我说“某个地方”,因为“某个地方”可能与你使用它的地方完全无关。您可以声明一个伪协议,其中包含相同消息的声明,从未在任何地方使用,它将用于声明的目的。或者您可以声明包含它的类别。随你。这对您来说似乎相当不可思议。但是,如果您使用协议获取@ HotLicks的解决方案,并删除强制转换,它仍然没有警告,因为协议是否使用无关紧要 - 这是与此相关的声明。

答案 1 :(得分:0)

定义包含MR_findAll的协议。在拨打电话之前将您的对象转换为该协议。

[(id<FindAllProtocol>)type MR_findAll]

答案 2 :(得分:-2)

尝试将您的类型变量转换为id,这是一种动态类型。