【问题标题】:Swift/Objective-C Crash: Swapped class initializers while debuggingSwift/Objective-C 崩溃:调试时交换类初始化器
【发布时间】:2021-11-26 11:11:36
【问题描述】:

总结

我在工作中的 Xcode 项目中遇到了一个严重问题,如果我能提供任何关于如何进一步缩小或解决此问题的建议、提示或 cmet,我将不胜感激!

一两周后,我们的项目在初始化 Swift 类或使用它们的类型的随机位置(在模拟器和设备上)调试时崩溃。

示例

这是一个外观示例:

  • 表格视图无法识别 ListSectionHeader 的继承
  • 打印类型时,返回不同的类
  • .self 的返回类始终是我们 Core.framework 的 Objective-C 类

另一个例子,super.init 调用失败,因为调试器突然将父类混淆为不同的类型:

  • 有时它会直接崩溃,当一个 Swift 类用 BAD_EXEC_ACCESS 初始化时

我们的尝试

到目前为止我们注意到并尝试过的事情:

  • 发布版本时崩溃消失
  • 启用内存或线程清理程序后问题消失
  • Xcode 12.4、12.5.1 和 Xcode 13.0 上出现此问题
  • 我们启用了“SWIFT_COMPILATION_MODE = Wholemodule”,这让问题消失了一段时间,但在项目中添加了更多 Swift 代码后问题又回来了
  • 如果我们添加或删除 Swift 代码,崩溃会转移到不同的类,就像移动了类名和类型的映射表 (??)(此处纯属推测)
  • 到目前为止,我无法在示例项目中重现该问题

其他信息

关于我们项目的一些事情:

  • 带有一些静态框架的 Xcode 工作区
  • 核心框架,大部分是 Objective-C 类
  • 仅 Swift 的 UserInterface-Framework 并在许多类中导入核心模块
  • 我们所有的框架都是伞形框架的一部分,该框架集成在我们用于调试的测试应用程序中

结束想法

我怀疑我们可能会意外触发某种编译器优化错误,这与我们混合的 Swift 和 Objective-C 代码库有关。

如果有人对如何缩小此崩溃范围有任何想法,或者看到了这些症状,我将不胜感激。现在它阻止我们进行任何开发。

【问题讨论】:

  • po ListSectioner.self 在调试器中产生奇怪的类名的情况下,你能检查一下po NSClassFromString("ListSectioner") 会发生什么吗?您可能需要适应 Swift 类损坏的名称。或者在 Swift 类定义中显式设置它,如这里 stackoverflow.com/questions/26132823/…@objc("YourCustomClassNameInObjCRuntime")
  • @Kamil.S 感谢您的建议。不过,我没有将那些 Swift 类暴露给 Objective-C,因为它们从来没有从那里被调用过。我只在我的 Swift 代码中使用 Objective-C 类。因此po NSClassFromString("…") 只返回nil

标签: ios swift objective-c xcode


【解决方案1】:

我们无法确定问题的根本原因,但是当我们在应用方案中禁用测试计划时,我们设法避免了崩溃/错误。当我们创建一个新的应用程序目标并且一切正常时,我们注意到了这一点。重新配置target和scheme后,一添加UI-test plan,问题又出现了。

也许这个策略可以帮助任何有类似问题的人。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-31
    • 2017-06-10
    • 2017-09-04
    相关资源
    最近更新 更多