为缺少弱链接祖先的类实例化类元数据

Posted

技术标签:

【中文标题】为缺少弱链接祖先的类实例化类元数据【英文标题】:Instantiating class metadata for class with missing weak-linked ancestor 【发布时间】:2021-05-28 16:12:44 【问题描述】:

当我使用 Xcode 12.5Swift 5.4 运行我的应用程序时。我在 pre-main 中遇到了崩溃:

instantiating class metadata for class with missing weak-linked ancestor

相同的代码在 Xcode 12.4Swift 5.3 上运行没有问题

【问题讨论】:

【参考方案1】:

instantiating class metadata for class with missing weak-linked ancestor

阅读该消息似乎表明,在启动时加载类元数据(“实例化类元数据”)时,运行时找不到关联的超类(“缺少弱链接祖先的类”)

这似乎得到了 Swift 代码库的证实。由于错误消息来自 Swift 运行时中的此函数:

static ClassMetadataBounds
computeMetadataBoundsForSuperclass(const void *ref,
                                   TypeReferenceKind refKind) 
  switch (refKind) 
    case TypeReferenceKind::IndirectTypeDescriptor: 
    auto description = *reinterpret_cast<const ClassDescriptor * const __ptrauth_swift_type_descriptor *>(ref);
    if (!description) 
      swift::fatalError(0, "instantiating class metadata for class with "
                         "missing weak-linked ancestor");
    
    return description->getMetadataBounds();
  

调用自:

// Compute the bounds for the superclass, extending it to the minimum
// bounds of a Swift class.
if (const void *superRef = description->getResilientSuperclass()) 
  bounds = computeMetadataBoundsForSuperclass(superRef,
                         description->getResilientSuperclassReferenceKind());
 else 
  bounds = ClassMetadataBounds::forSwiftRootClass();

这是运行时寻找它正在加载的类的超类的地方。

经过一番挖掘,事实证明,在 Swift 5.3 上,您可以拥有

@available(ios 13.0, *)
class A 
   class B: HostingView<MyView> 
   

AA.B 在 iOS 12 中都将被忽略。在 Swift 5.4 中(不确定是更改还是错误)A 被忽略,但 A.B 已加载。

因此您可以通过以下方式解决崩溃:

@available(iOS 13.0, *)
class A 
   @available(iOS 13.0, *)
   class B: HostingView<MyView> 
   

【讨论】:

请检查一下***.com/questions/71110031/…

以上是关于为缺少弱链接祖先的类实例化类元数据的主要内容,如果未能解决你的问题,请参考以下文章

创建java类并实例化类对象

Python 在类定义中实例化类

使用工厂模式按名称实例化类

实例化类对象中alloc和inti的区别

在pyqt中使用yaml 实例化类

在pyqt中使用yaml 实例化类