是否有一个包含运行时类型编码字符的枚举?

时间:2012-12-27 15:38:19

标签: objective-c encoding objective-c-runtime

Objective-C对基元使用单字母类型编码;例如,'c'char'i'int。这些内容记录在Obj-C运行时参考中。

是否存在可以对这些进行建模的enum

1 个答案:

答案 0 :(得分:2)

没有这样的enum。编码最初由编译器构建,编译器只是在其代码中嵌入了文字字符串。您可以在ASTContext.cpp中看到它们,特别是方法getObjCEncodingForTypeImpl()getObjCEncodingForPrimitiveKind()

runtime libraryobjc-typeencoding.mm中有一组读取这些字符串的函数。你可以自己使用它们;该代码可在Apple的开源许可下使用。 (编译器ASTContext也有一种方法可以执行此操作,DecodeTypeFromStr()。)

显然,运行时和编译器必须保持同步,直到这些编码。实际上,由于更改类型的编码字符会产生二进制不兼容性,因此根本不可能发生,当然也不会没有通知;您可以依赖运行时指南中的列表来保持稳定。

当然,我不想说添加的内容:"@?"是一个Block的编码字符串,在它们被引入之前并不存在(尽管它和&# #39; s类似于/派生自表示函数指针的"^?"

您可能也对Mike Ash的article about linking up libffi and Blocks感兴趣,他在其中演示a series of macros来读取编码字符串和 产生它的真实类型。