【发布时间】: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