在运行时调试问题

时间:2012-10-18 15:08:47

标签: objective-c debugging xcode4.4

我已经为我一直在制作的下钻表应用程序编写了一些代码,但应用程序仅在运行时崩溃。在构建应用程序时,Xcode不会给我任何错误。调试器输出:

  

2012-10-18 10:58:26.513秒[474:c07] - [NavController setItems:]:无法识别的选择器>发送到实例0xc217a00   2012-10-18 10:58:26.515秒[474:c07] *由于未捕获的异常终止应用>'NSInvalidArgumentException',原因:' - [NavController setItems:]:无法识别的选择器发送>到实例0xc217a00 “   * 第一次抛出调用堆栈:   (0x14b8022 0xeb8cd6 0x14b9cbd 0x141eed0 0x141ecb2 0x3fbe 0xe2a1e 0x41401 0x41670 0x41836> 0xbfc9dd8 0x4872a 0x19596 0x1a274 0x29183 0x29c38 0x1d634 0x13a2ef5 0x148c195 0x13f0ff2> 0x13ef8da 0x13eed84 0x13eec9b 0x19c65 0x1b626 0x1d40 0x1cd9)   终止调用抛出异常

我想我明白错误在于NavController.m,其中:

- (void)viewDidLoad
{
    [super viewDidLoad];
    NSString* path = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    MasterViewController* root = (MasterViewController*)self.topViewController;
    NSDictionary* thelist = [NSDictionary dictionaryWithContentsOfFile:path];
    root.items = [thelist objectForKey:@"Items"];
    root.navigationItem.title = [thelist objectForKey:@"name"];
}
顺便说一句,我制作了这样的数组项:(非原子,保留)NSArray *项目;

2 个答案:

答案 0 :(得分:0)

问题可能在这里:

MasterViewController* root = (MasterViewController*)self.topViewController;

self.topViewController可能不是MasterViewController的实例,而是一个NavController实例,你去了。

答案 1 :(得分:0)

应用程序崩溃,因为以下行:

root.items = [thelist objectForKey:@"Items"];

这一行只是写作的捷径:

[root setItems:[thelist objectForKey:@"Items"]];

运行时抱怨找不到方法setItems:。编译错误的原因是因为您告诉编译器root属于类MasterViewController,但事实并非如此。在运行时,obj-c运行时发现root实际上是类NavController,而NavController似乎没有setItems:方法。

换句话说,这一行是错误的:

MasterViewController* root = (MasterViewController*)self.topViewController;
你在课堂上撒谎; self.topViewController返回类NavController的对象,但是强制编译器将其视为MasterViewController,一旦调用{{1}找不到的方法,它将失败}}