【问题标题】:ios7: adding iAd.framework to a project causes SIGABRT on runios7:将 iAd.framework 添加到项目会导致 SIGABRT 运行
【发布时间】:2014-04-25 08:56:42
【问题描述】:

我有一个项目运行良好。我想在其中加入广告并制作免费版本。我复制了该项目,将其重命名并添加了 iAd.framework。但它已经导致 SIGABRT 运行。

调试不能解释任何事情......它在从根 VC 的 viewDidLoad 方法设置一些 VC 属性时崩溃。我认为这无关紧要,但如果您不这么认为,可以提供详细信息。

与 iAd 链接有什么技巧吗?提前感谢您的帮助!

编辑:添加了日志和一些说明

2014-04-25 16:04:04.249 MyAppTEST[686:60b] -[MPViewController setSoundName:]:无法识别的选择器发送到实例 0x16e43a30

2014-04-25 16:04:04.252 MyAppTEST[686:60b] * 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:'-[MPViewController setSoundName:]:发送了无法识别的选择器到实例 0x16e43a30'

它抱怨无法识别的选择器(准确地说是属性设置器)。但除了链接 iAd.framework 之外,我没有做任何更改。如果我删除这个框架,它会再次开始正常工作。

经过更多跟踪后,我发现,使用 iAd 框架,[self.storyboard instantiateViewControllerWithIdentifier:@"MPPageContentController"]; 返回一个不正确类型的视图控制器,但不是零!

MPViewController *pageContentViewController = [self.storyboard instantiateViewControllerWithIdentifier:@"MPPageContentController"];
if ([pageContentViewController isKindOfClass:[MPViewController class]]) {
    NSLog(@"OK");
}

删除iAd.framework时测试通过,否则失败!有什么建议吗?

编辑2: 这是一个真正的故障!我已将测试更新如下:

    MPViewController *pageContentViewController = (MPViewController*)[self.storyboard instantiateViewControllerWithIdentifier:@"MPPageContentController"];
    if ([pageContentViewController isKindOfClass:[MPViewController class]]) {
        NSLog(@"OK");
    } else {
        NSLog(@"%@", [pageContentViewController description]);
    }

并且,如果将 iAd 添加到项目中,控制台中会记录以下内容: " MPViewController: 0xa63fd30 "

我确实在“调试”模式下的“变量视图”面板中看到了必需的 MPViewController 属性,尽管它们声称无法识别……这变得越来越奇怪,但我已经没有前进的想法了!有什么帮助吗?

【问题讨论】:

  • SIGABRT 很可能由于异常而崩溃。抛出了什么异常?
  • 2014-04-25 16:04:04.249 MyAppTEST[686:60b] -[MPViewController setSoundName:]:无法识别的选择器发送到实例 0x16e43a30 2014-04-25 16:04:04.252 MyAppTEST[686 :60b] *** 由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“-[MPViewController setSoundName:]:无法识别的选择器发送到实例 0x16e43a30”
  • 这是一个很长的镜头,但你可以尝试一个明确的演员表吗? MPViewController *pageContentViewController = (MPViewController*)[self.storyboard instantiateViewControllerWithIdentifier:@"MPPageContentController"];
  • 另一个远景:你试过重命名视图控制器类吗?这个错误实际上很有趣;)
  • 这令人难以置信,但它帮助了!你是我的英雄;)请回答这个问题,我会投票给它。顺便说一句,是 ios bug 还是什么?!

标签: ios frameworks iad sigabrt ios7.1


【解决方案1】:

您的应用程序崩溃的原因是Apple 有一个名为MPViewController 的类,如您所见here

更改 ViewController 的类名可以解决此问题。

我假设 iAd 在内部使用这个类来展示广告。编译器决定使用 Apples 类而不是您的类,因此您得到了 does not respond to selector 异常,因为 Apple 的 MPViewController 不响应该选择器。


您可以看到,遵循 Cocoa 命名约定并在您的类前面加上 3 个字母是个好主意。我现在找不到参考资料,但我记得他们说过(或说过)2 个字母前缀是为 Apple 类保留的。

【讨论】:

  • 非常感谢您的解释。很不错的体验,下次我在选择VC名称时会更加小心))再次感谢。
猜你喜欢
  • 2011-02-10
  • 1970-01-01
  • 2021-12-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多