iOS 11.3和Xcode 9.3导致Obj-C应用程序启动失败

所以这是一个奇怪的…我们有一个用Obj-C编写的应用程序,在任何人更新到iOS 11.3之前它运行良好。 11.3更新打破了它…但是使用Xcode 9.3和新编译器,我们在任何和所有设备上都会遇到相同的错误。 所以看来苹果在SDK中打破了一些东西。

出于同样的原因,似乎如果他们真的在SDK中破坏了某些内容,那么每个人都会遇到这个问题。 所以我转向你,SO的智慧,帮我解决这个问题!

注意:只是非常清楚:这是一个用Obj-C编写的旧应用程序,而不是Swift,并且只在维护一段时间。

因此,令人讨厌的代码块非常简单:

- (UINavigationController *)controllerForCategories: (NSArray *)categories titled:(NSString *)title { DocumentViewController *dc = [[DocumentViewController alloc]initWithCategories:categories titled:title]; UINavigationController *nc = [[UINavigationController alloc]initWithRootViewController:dc]; [self addChildViewController:nc]; // ERROR HAPPENS ON THIS ^^ LINE [nc didMoveToParentViewController:self]; [self.contentPanel addSubview:nc.view]; nc.view.frame = self.contentPanel.bounds; return nc; } 

现在根据Apple文档,那应该没问题。 如果我们覆盖了addChildViewController(),那么我们可能会遇到问题,但我们没有,我们只是调用方法。 名为“nc”的参数是一个扩展UIViewController的SDK类,因此它是有问题的方法的有效参数。 但是,在11.3上(或者在Xcode 9.3的所有iOS版本上,我们在任何设备上每次启动时都会收到此错误:

2018-04-25 14:42:18.792216-0700 Steri-Vac GS [1090:855706] – [MasterNavigationViewController _viewControllerSubtreeDidGainViewController:]:无法识别的选择器发送到实例0x101210100 2018-04-25 14:42:18.792662-0700 Steri-Vac GS [1090:855706 *终止应用程序由于未捕获的exception’NSInvalidArgumentException’,原因是: ‘ – [MasterNavigationViewController _viewControllerSubtreeDidGainViewController:]:无法识别的选择发送到实例0x101210100’ *第一掷调用堆栈:(0x186c4b164 0x185e94528 0x186c58628 0x1905c6188 0x186c50b10 0x186b35ccc 0x19029a964 0x19029d2c0 0x100a4941c 0x100a48bec 0x190205a00 0x1902055d8 0x19020c1a4 0x190209404 0x1902782e8 0x100a77a24 0x1902742c4 0x190465bc4 0x19046aa14 0x1907062a8 0x1909de100 0x190705f0c 0x19070676c 0x190e8b7c0 0x190e8b664 0x190bf92cc 0x190d923cc 0x190bf917c 0x1909dd760 0x190469158 0x19087edbc 0x18930e1f0 0x189316af8 0x100bb928c 0x100bc59e4 0x1893427f8 0x18934249c 0x189342a38 0x186bf377c 0x186bf36fc 0x186bf2f84 0x186bf0b5c 0x186b1 0c58 0x1889bcf84 0x1902695c4 0x100a51994 0x18663056c)libc ++ abi.dylib:以NSException类型的未捕获exception终止

我已经向Apple提交了一个错误并提交了代码以支持它,但我想我会在这里查看大脑信任,看看是否有人有什么我可以同时查看的内容。 目前我们的应用程序没用,40%的现场服务技术已经更新到11.3,所以它对我们来说是一个关键问题。

伙计们,提前谢谢!

Apple回应了我的错误!

事实certificate,我们的类是扩展UIViewController并实现一个名为navigationController的属性,它是UIViewController的另一个实例,同时UIViewController有一个名为navigationController的属性…是UINavigationController的一个实例。 诀窍是简单地将我们的navigationController重命名为navController。 冲突得到解决。

真正的问题是为什么在更新到Xcode 9.3后它才停止工作,并且直到我们的用户更新到iOS 11.3才真正破坏应用程序。 在11.2下,原始应用运行正常。 更新到Xcode 9.3后,编译应用程序将无法在任何版本的iOS上运行。

很奇怪!