iOS底层系列之<13>--Runtime(一)isa 和 位域技术

1、isa指针

  • 从64bit开始,isa需要进行一次位运算,才能计算出真实的地址
    在这里插入图片描述
  • 从arm64架构之前,isa就是一个普通的指针,存储着Class、Meta-Class对象的内存地址,之后的就变成一个union(共用体)

2、代码展现

Person.h文件
@interface Person : NSObject
- (void)setTall:(BOOL)tall;
- (void)setRich:(BOOL)rich;
- (void)setHandsome:(BOOL)handSome;

- (BOOL)isTall;
- (BOOL)isRich;
- (BOOL)isHandsome;

@end

Person.m文件
#import "Person.h"

#define JHTallMask (1 << 0)
#define JHRichMask (1 << 1)
#define JHHandsomeMask (1 << 2)

@interface Person()
{
    union {
        char bits;
        struct { // 作用:仅仅增加代码可读性
            char tall : 1; 
            char rich : 1;
            char handsome: 1;
        };
    } _tallRichHandsome;
    
    // & 按位与运算 复习: 都是1 结果才是1
    //    0011
    //  & 1111
    //----------
    //    0011

    // 能取出特定位的值
        
        // | 按位或运算  只要有一个为1,结果就是1
    //    0010 1000
    //|   1111 1110
    //--------------
    //    1111 1110
        
    //    0000 0010
    //|   0000 0001
    //-------------
    //    0000 0011
        
    //    0010 0010
    //&   1111 1101  ==》 按位取反 ~0000 0010
    //   -------------
    //    0010 0000
}
@end

@implementation Person
- (void)setTall:(BOOL)tall {
    if (tall) {
        _tallRichHandsome.bits |= JHTallMask;
    } else {
        _tallRichHandsome.bits &= ~JHTallMask;
    }
}

- (BOOL)isTall {
    return !!(_tallRichHandsome.bits & JHTallMask);
}

- (void)setRich:(BOOL)rich {
    if (rich) {
        _tallRichHandsome.bits |= JHRichMask;
    } else {
        _tallRichHandsome.bits &= ~JHRichMask;
    }
    
}

- (BOOL)isRich {
    return !!(_tallRichHandsome.bits & JHRichMask);
}


- (void)setHandsome:(BOOL)handSome {
    if (handSome) {
        _tallRichHandsome.bits |= JHHandsomeMask;
    } else {
        _tallRichHandsome.bits &= ~JHHandsomeMask;
    }
}

- (BOOL)isHandsome {
    return !!(_tallRichHandsome.bits & JHHandsomeMask);
}

@end

Person *person = [[Person alloc] init];
person.rich = NO;
person.tall = NO;
person.handsome = YES;
NSLog(@"%d %d %d",person.isRich,person.isTall,person.isHandsome);

// 打印结果: 0 0 1

3、同时传多种值的方法

typedef enum {
    JHOptionsOne        = 1 << 0,
    JHOptionsTwo        = 1 << 1,
    JHOptionsThree      = 1 << 2,
    JHOptionsFour       = 1 << 3,
} JHOptions;

@interface ViewController ()

@end

@implementation ViewController

- (void)setOptions:(JHOptions)options {
    if (options & JHOptionsOne) {
        NSLog(@"包含了JHOptionsOne");
    }
    
    if (options & JHOptionsTwo) {
        NSLog(@"包含了JHOptionsTwo");
    }
    
    if (options & JHOptionsThree) {
        NSLog(@"包含了JHOptionsThree");
    }
    
    if (options & JHOptionsFour) {
        NSLog(@"包含了JHOptionsFour");
    }
}
  • 调用
[self setOptions:JHOptionsOne | JHOptionsTwo | JHOptionsFour];

打印:
2022-01-07 10:00:51.632267+0800 01-位运算[46785:526841] 包含了JHOptionsOne
2022-01-07 10:00:51.632378+0800 01-位运算[46785:526841] 包含了JHOptionsTwo
2022-01-07 10:00:51.632459+0800 01-位运算[46785:526841] 包含了JHOptionsFour

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值