1

我遇到了一个我很难始终如一地重新创建的错误。我认为这与我没有投射物体但我不是 100% 确定这一事实有关。

UINavigationController *navController = [self navigationController];
MainGameViewController *controller = [navController.viewControllers objectAtIndex:2];

controller.phase = @"READY";

我知道 objectAtIndex:2 将始终返回 MainGameViewController 类型的对象,但它没有被强制转换的事实可能是不一致错误的根源吗?错误发生在我提供的第三行。

这是跟踪:

0   CoreFoundation                  0x3a6703e2 __exceptionPreprocess + 158
1   libobjc.A.dylib                 0x394fc95e objc_exception_throw + 26
2   CoreFoundation                  0x3a673f2c -[NSObject(NSObject) doesNotRecognizeSelector:] + 180
3   CoreFoundation                  0x3a672648 ___forwarding___ + 388
4   CoreFoundation                  0x3a5ca204 _CF_forwarding_prep_0 + 20
5   AppName                     0x0003af56 -[ResultViewController BackToMainGameView] (ResultViewController.m:286)

错误发生在类 ResultsViewController 中。

4

2 回答 2

2

不,铸造与问题无关。出现异常的原因是有时索引 2 处的对象类型错误。错误没有持续发生的事实是一个额外的线索:寻找游戏控制器不在第二个索引的情况来解决这个问题。

通常,强制转换有助于告诉编译器更多关于对象类型的信息。鉴于 Objective C 的动态特性,这比在 C++ 中的重要性要小得多。

于 2013-01-03T05:59:10.760 回答
0

我认为这与我没有投射物体但我不是 100% 确定这一事实有关。

不,强制转换只是为了欺骗编译器(在这种特殊情况下),对象的实际类是在运行时确定的。发生异常是因为您的对象没有实现它发送的方法,因为它不是预期的类。

于 2013-01-03T06:00:56.760 回答