objective-c - iOS 检测类是 Objective-C 还是 Swift

标签 objective-c swift objective-c-runtime

我正在开发一个内部工具(永远不会提交到 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/

相关文章:

ios - 具有动态大小和纵横比的 UIImages。我究竟做错了什么?

ios - 如何防止用户写除英文以外的任何内容 Ios

ios - 检查是否定义了协议(protocol)方法

ios - iPhone/iPad iOS7 中的设备方向问题

ios - 将 Google map 添加到我的应用程序时出现问题

ios - 转到其他 View 后,Tabbar 按钮的顺序发生了变化

swift - 在分支中引用 switch 语句的值

objective-c - GNU Objective-C 运行时技巧

ios - 如果来自 UIViewController 的对象如何仅获取我创建的自定义属性的名称(在运行时)?

ios - 如何使用 FBSDKShareLink 在 Facebook 上分享链接?