Swift Objective-C运行时类命名

时间:2014-06-05 14:31:41

标签: ios objective-c class runtime swift

我注意到在Objective-c运行时重命名了Swift类。所以如果我在swift中有一个名为ViewController的类,当我执行TestRuntime时,我的应用名称为object_getClass(self) self ViewController,我会得到这个:_TtC11TestRuntime14ViewController。我注意到这种模式或格式:_TtC$$AppName$$ClassName $ 是一个随机数。我无法弄清楚这些数字的来源。如果有人能够了解swift如何快速命名它在运行时的类,那将真正帮助我。

2 个答案:

答案 0 :(得分:8)

他们不是随意的。它们是以下值的长度。这类似于常见的C ++名称修改,并支持可能在其中包含相当任意字符的标识符,而不需要一些新的分隔符。它还可以使它们更易于解析,尤其是在C中。

在这种特殊情况下,它是_TtC然后是“十一个字符模块名称”,然后是模块名称,然后是“十四个字符类名”和类名。我假设C是班级。不确定Tt(可能是“类型”)。

答案 1 :(得分:1)

描述将在以下3个部分中构建

  1. 描述以_Tt开头,它代表目标(包/应用名称)
  2. 之后你会有一个或多个字母,如C P F代表Class,Protocol或Function。根据嵌套
  3. ,它们的顺序相反
  4. 然后,您将获得一系列数字以及一个名称,其中数字是名称的长度。这些中的每一个都用于描述开头所指定的目标,类,协议或功能。
  5. 这里的功能是一个特例。该描述还将提供有关函数签名的一些信息。

    例如,您可以拥有_TtCFCC5MyApp7MyClass10MySubClass6myFuncFS0_FT_T_L_11MySubSubClass

    这将是以下代码中MySubSubClass的描述:

    class MyClass {
       class MySubClass {
         func myFunc() {
           class MySubSubClass {
           }
         }
       }
    }
    

    在这里,您可以找到一些sample code,它将该描述解析为易于使用的属性和数组。

    更新:Demangle现在转换为swift。您可以在此处找到它:https://github.com/mattgallagher/CwlDemangle/blob/master/CwlDemangle/CwlDemangle.swift