我不确定这是否与我的问题有关,但我将从头开始:在我的项目中,我有一个视图控制器,它由类名动态实例化,如下所示:
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
用任何其他视图控制器换掉,我就无法重现这个问题。如果我重命名someViewController
为someViewController2
我无法重现问题。问题在于符号名称someViewController
。然后我突然意识到someViewController
曾经是一个UITableViewController
并且会tableView:numberOfRowsInSection:
实施的。
在任何情况下; 从设备上删除应用程序并让 XCode 部署一个干净的副本解决了这个问题。
我想知道的是,为什么?如何?我想我已经有一段时间知道 XCode 在部署时会做一些时髦的事情——在从项目中删除旧资源之后,我曾遇到过问题。但我没想到 Objective-C 类型会出现问题。