我正在开发一个内部工具(永远不会提交到 App Store 的东西),我想在运行时检测一个类是 Objective-C 还是 Swift。这可能吗?
最佳答案
如果出于学术目的,您绝对必须知道一个类是否是用 swift 代码创建的(而不是通过 objc_allocateClassPair
很容易被愚弄的方式) ),然后您可以利用可以在 objc-runtime-new.h
中找到的信息,特别是与 FAST_IS_SWIFT
相关的标志。
要提取这些标志而不必将源代码制作为 C++ 或与包含大量私有(private) header 作斗争,您可以使用类似于以下内容的内容,但请注意:这是 super 脆弱。
这可能在任何地方都不是 ABI 强制执行的,任何 future 的版本都可以更改它而不会产生任何后果。请记住这一点,等等。
事不宜迟,疯狂的黑客攻击接踵而至:
#define FAST_IS_SWIFT (1UL<<0)
#define FAST_HAS_DEFAULT_RR (1UL<<1)
#define FAST_DATA_MASK 0xfffffffcUL
uintptr_t getClassBits(Class kls) {
#if __LP64__
typedef uint32_t mask_t;
#else
typedef uint16_t mask_t;
#endif
return ((const struct {
/* struct objc_class */
Class isa;
Class superclass;
/* struct cache_t */
void *bucket_t;
mask_t mask;
mask_t occupied;
/* struct class_data_bits_t */
uintptr_t bits;
} *) (__bridge const void *) kls)->bits;
}
这是从 objc-runtime-new.h
重新创建结构格式,没有所有额外的 C++ 开销。
一旦你有了一个类的比特,只需将它与 FAST_IS_SWIFT
进行比较(例如 bits & FAST_IS_SWIFT
),你就会得到答案。
关于objective-c - iOS 检测类是 Objective-C 还是 Swift,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34032460/