美文网首页
Runtime - isa

Runtime - isa

作者: xxttw | 来源:发表于2023-06-08 22:40 被阅读0次
    isa详解
    • & 按位与 用来取出特定的位
    • 大家都是1才是1, 其他就是0
    • 要取哪一位就让取的这位是1, 其他位都是0即可
     0011
    &0010
    ----------
     0010
    
     0111
    &1111
    --------
     0111 大家都是1 结果才1, 其他结果都是0
    
     0111
    &1110
    --------
     0110 其他结果是0
    
    • | 按位或
    • 有一位是1,则全是1
    • 要修改哪一位就让哪一位是1
     0010 1000
    |0000 0010
    ----------------
     0010 1010
    

    union 联合体

    arm64位后 isa的结构变更为union, 共用一块内存, struct只是做说明展示作用, 告诉你这里面表示什么, 用了几位进行存储

    union {
        char bits;
      struct {
        char tall : 1;
        char rich : 1;
        char handsome : 1;
        char thin : 1;
      }
    }
    
    struct objc_object {
        isa_t isa;
    }
    
    union isa_t {
        isa_t() { }
        isa_t(uintptr_t value) : bits(value) { }
    
        uintptr_t bits;
        struct {
            uintptr_t nonpointer        : 1;                                       \
            uintptr_t has_assoc         : 1;                                       \
            uintptr_t has_cxx_dtor      : 1;                                       \
            uintptr_t shiftcls          : 33; /*MACH_VM_MAX_ADDRESS 0x1000000000*/ \ 存放类和元类对象的地址值
            uintptr_t magic             : 6;                                       \
            uintptr_t weakly_referenced : 1;                                       \
            uintptr_t unused            : 1;                                       \
            uintptr_t has_sidetable_rc  : 1;                                       \
            uintptr_t extra_rc          : 19
    }
    }
    
    • arm64位架构之前 isa一个普通的指针, 直接存放的类, 元类对象的内存地址
    • arm64位架构开始, isa进过优化改用了union共用体这种结构, 用位域 将一个64位的内存数据分开按位来存储 更多信息,其中的33位shiftcls是用来存储类,元类的地址值, & 一个iSA_MASK通过按位运算 ,以获取到这33位的地址值
    image.png
    位域 取值赋值的原理

    WTOptionsOne | WTOptionsThree | WTOptionsFour 相当于WTOptionsOne + WTOptionsThree |+WTOptionsFour
    相加后的值 分别& 上每一项的的, 就可以知道当前这一项是否存储其中

    
     WTOptionsOne | WTOptionsTwo | WTOptionsFour
     0b0001
     0b0010
     0b1000
     -------
     0b1011
     
     WTOptionsOne
     0b1011
    &0b0001
    --------
     0b0001
     
     WTOptionsTwo
     0b1011
    &0b0010
    --------
     0b0010
     
     WTOptionsFour
     0b1011
    &0b1000
    --------
     0b1000
    
    typedef enum{
        WTOptionsNone  =0             // 0b0000
        WTOptionsOne    =   1 << 0, // 0b0001
        WTOptionsTwo    =   1 << 1, // 0b0010
        WTOptionsThree  =   1 << 2, // 0b0100
        WTOptionsFour   =   1 << 3  // 0b1000;
    } WTOptions;
    
        self.options = WTOptionsOne | WTOptionsThree | WTOptionsFour;
    - (void)setOptions:(WTOptions)options
    {
        if (options & WTOptionsOne) {
            NSLog(@"包含 WTOptionsOne");
        }
        if (options & WTOptionsTwo) {
            NSLog(@"包含 WTOptionsTwo");
        }
        if (options & WTOptionsThree) {
            NSLog(@"包含 WTOptionsThree");
        }
        if (options & WTOptionsFour) {
            NSLog(@"包含 WTOptionsFour");
        }
    }
    2022-12-21 19:44:32.059701+0800 多线程-读写锁[60716:10928813] 包含 WTOptionsOne
    2022-12-21 19:44:32.059761+0800 多线程-读写锁[60716:10928813] 包含 WTOptionsThree
    2022-12-21 19:44:32.059796+0800 多线程-读写锁[60716:10928813] 包含 WTOptionsFour
    

    相关文章

      网友评论

          本文标题:Runtime - isa

          本文链接:https://www.haomeiwen.com/subject/lgwuqdtx.html