1

我不确定这是否与我的问题有关,但我将从头开始:在我的项目中,我有一个视图控制器,它由类名动态实例化,如下所示:

NSString* className;

...className is set to a valid class name, e.g. "someViewController"

Class c = NSClassFromString( className );
UIViewController* vc = [[c alloc] init];

在当前构建的项目中,someViewController只是一个专门的 UIViewController。但是,在项目的版本(之前部署到我的设备上)中,视图控制器类型someViewController是专门的UITableViewController.

今天早上我花了很多时间试图理解为什么当我在设备上运行构建(从 XCode 部署)时,它会因奇怪的调用堆栈和控制台消息而崩溃:

[someViewController tableView:numberOfRowsInSection:]: unrecognized selector sent to instance 0xeb62a0

经过大量实验,我发现如果我someViewController用任何其他视图控制器换掉,我就无法重现这个问题。如果我重命名someViewControllersomeViewController2我无法重现问题。问题在于符号名称someViewController。然后我突然意识到someViewController 曾经是一个UITableViewController并且会tableView:numberOfRowsInSection:实施的。

在任何情况下; 从设备上删除应用程序并让 XCode 部署一个干净的副本解决了这个问题。

我想知道的是,为什么?如何?我想我已经有一段时间知道 XCode 在部署时会做一些时髦的事情——在从项目中删除旧资源之后,我曾遇到过问题。但我没想到 Objective-C 类型会出现问题。

4

1 回答 1

0

简单地重命名 .h 和 .m 文件,然后引入具有相同名称的新 .h 和 .m 会导致问题。不是对xcode,而是对你。最好的方法是将文件复制到 /tmp 之类的目录,从项目中删除它们,然后将它们作为新的名称添加到项目中。

于 2012-06-20T21:10:41.793 回答