1

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

问题是,当我想获取这些数据时,我使用这样的东西:

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

这个编译和运行完美,除了 xcode 显示一个讨厌的错误:“不知道 MR_findALL 的类方法”。

我可以对 NSManagedObject 执行类似“Class cast”的操作,这样错误就会消失吗?我想让它保持动态,我不想为我的所有模型定义一个条件。

4

3 回答 3

2

问题不在于静态类型检查。Class,如id,禁用静态类型检查。

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

请注意,我说的是“某处”,因为“某处”可能与您使用它的位置完全无关。您可以声明一个虚拟协议,其中包含同一消息的声明,该协议从未在任何地方使用过,它将达到声明的目的。或者您可以声明一个包含它的类别。任何。这对你来说可能看起来相当不可思议。但是,如果您将@HotLicks 的解决方案与协议一起使用,并删除演员表,它仍然不会有警告,因为是否使用协议并不重要——这是与此处相关的声明。

于 2012-10-09T03:07:46.250 回答
0

定义一个包含MR_findAll. 在进行调用之前将您的对象转换为该协议。

[(id<FindAllProtocol>)type MR_findAll]

于 2012-10-08T16:53:12.490 回答
-2

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

于 2012-10-08T16:16:19.323 回答