部署到设备导致frankenstein二进制

时间:2012-06-20 20:53:10

标签: objective-c ios xcode

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

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类型存在问题。

1 个答案:

答案 0 :(得分:0)

只需重命名.h和.m文件,然后引入一个同名的新.h和.m就会出现问题。不是xcode,而是你。最好是将文件复制到/ tmp这样的目录,从项目中删除它们,然后将它们作为具有不同名称的新项目添加到项目中。