美文网首页
OC基础 Runtime-isa (2)

OC基础 Runtime-isa (2)

作者: 我是卖报的小行家 | 来源:发表于2021-03-10 09:38 被阅读0次

Runtime-isa 设值

isa之设值:
与运算 |

#import "ZKPerson.h"

//掩码:按位与运算
//#define MJTallMask 1
//#define MJRichMask 2
//#define MJHandsomeMask 4
//继续优化
//#define MJTallMask 0b00000001
//#define MJRichMask 0b00000010
//#define MJHandsomeMask 0b00000100
//继续优化
//此处拿到的1为 0b00000001
#define MJTallMask (1<<0)         //拿到1左移0位取到0 相当于不移动还是0
#define MJRichMask (1<<1)        //拿到1左移一位取到1  0b00000010
#define MJHandsomeMask (1<<2)     //拿到1左移两位位取到2 0b00000100

@interface ZKPerson()
{
    char _isTallRichHandsome;
}
@end
@implementation ZKPerson


- (instancetype)init
{
    self = [super init];
    if (self) {
        _isTallRichHandsome = 0b00000110;
    }
    return self;
}

- (void)setTall:(BOOL)tall
{
    if (tall) {
        _isTallRichHandsome |= MJTallMask;
    }else{
        //按位与除了他的那一位为0,其他全为1(总结:每一位取反(~),按位与)
        _isTallRichHandsome &= ~MJTallMask;
    }
    
}
- (BOOL)tall
{
    return !!(_isTallRichHandsome &MJTallMask);
}
- (void)setRich:(BOOL)rich
{
    if (rich) {
        _isTallRichHandsome |= MJRichMask;
    }else{
        //按位与除了他的那一位为0,其他全为1(总结:每一位取反(~),按位与)
        _isTallRichHandsome &= ~MJRichMask;
    }
}
- (BOOL)rich
{
    return !!(_isTallRichHandsome &MJRichMask);
}
- (void)setHandsome:(BOOL)handsome
{
    if (handsome) {
        _isTallRichHandsome |= MJHandsomeMask;
    }else{
        //按位与除了他的那一位为0,其他全为1(总结:每一位取反(~),按位与)
        _isTallRichHandsome &= ~MJHandsomeMask;
    }
}
- (BOOL)handsome
{
    return !!(_isTallRichHandsome &MJHandsomeMask);
}
@end

Main.m

        ZKPerson *zk = [[ZKPerson alloc]init];
        zk.tall = 0;
        zk.rich = 1;
        zk.handsome = 0;
        NSLog(@"%d,%d,%d",zk.tall,zk.rich,zk.handsome);
//打印结果:2021-03-09 22:36:28.968453+0800 DoBlock[2072:2727939] 0,1,0

优化:位域
再次优化 使用结构体

@interface ZKPerson()
{
    struct {
        char tall:1;
        char rich:1;
        char handsome:1;
        
    }_isTallRichHandsome;

}
@end
@implementation ZKPerson


- (instancetype)init
{
    self = [super init];
    if (self) {
    }
    return self;
}

- (void)setTall:(BOOL)tall
{
    _isTallRichHandsome.tall = tall;
}
- (BOOL)tall
{
    return !!_isTallRichHandsome.tall;
}
- (void)setRich:(BOOL)rich
{
    _isTallRichHandsome.rich = rich;
}
- (BOOL)rich
{
    return !!_isTallRichHandsome.rich;
}
- (void)setHandsome:(BOOL)handsome
{

    _isTallRichHandsome.handsome = handsome;
}
- (BOOL)handsome
{
    return !!_isTallRichHandsome.handsome;
}
@end

再次优化 union

#define MJTallMask (1<<0)         //拿到1左移0位取到0 相当于不移动还是0
#define MJRichMask (1<<1)        //拿到1左移一位取到1  0b00000010
#define MJHandsomeMask (1<<2)     //拿到1左移两位位取到2 0b00000100

@interface ZKPerson()
{
    union {
        int  bits;
        struct{
            char tall : 1;
            char rich : 1;
            char handsome : 1;
        };
    }_isTallRichHandsome;

}
@end
@implementation ZKPerson


- (instancetype)init
{
    self = [super init];
    if (self) {
    }
    return self;
}

- (void)setTall:(BOOL)tall
{
    if (tall) {
        _isTallRichHandsome.bits |= MJTallMask;
    }else{
        _isTallRichHandsome.bits &= ~MJTallMask;
    }
   
}
- (BOOL)tall
{
    return !!(_isTallRichHandsome.bits & MJTallMask);
}
- (void)setRich:(BOOL)rich
{
    if (rich) {
        _isTallRichHandsome.bits |= MJRichMask;
    }else{
        _isTallRichHandsome.bits &= ~MJRichMask;
    }

}
- (BOOL)rich
{
    return !!(_isTallRichHandsome.bits & MJRichMask);
}
- (void)setHandsome:(BOOL)handsome
{
    if (handsome) {
        _isTallRichHandsome.bits |= MJHandsomeMask;
    }else{
        _isTallRichHandsome.bits &= ~MJHandsomeMask;
    }

}
- (BOOL)handsome
{
    return !!(_isTallRichHandsome.bits & MJHandsomeMask);
}
@end

相关文章

  • OC基础 Runtime-isa (2)

    Runtime-isa 设值 isa之设值:与运算 | Main.m 优化:位域再次优化 使用结构体 再次优化 u...

  • OC基础 Runtime-isa (3)

    前面我们知道在arm64位之后实例对象的isa指针&ISA_MASK之后是指向class类对象,class类对象的...

  • iOS基础 Runtime-isa (1)Runtime-isa

    Runtime 基础 (1)isa详解OC是一门动态性比较强的编辑语言,OC的动态性是由Runtime API来支...

  • 基础绘制

    1.基础画线OC: swift: 2.画弧线OC Swift 3.画圆(椭圆)OC Swift 4.画弧OC Sw...

  • iOS基础学习积累&查漏补缺

    ——————————————————oc基础 1、Xcode interface builder 2、improt...

  • Swift与OC的区别

    Swift与OC的区别 1、基础篇 2、监听方法 OC 使用 @selector(actionName) Sw...

  • OC基础笔记(2)

    1.UI控件用weak修饰而不用strong 控制器默认强引用view与subview,所以拖控件IBOutlet...

  • 回顾OC基础2

  • OC基础-category(2)

    Category的load方法 定义一个ZKPerson类,然后类扩展出来两个分类(Test)(Test1)如下图...

  • OC基础-Block(2)

    OC基础-Block(2)Block的变量捕获为了保证block内部能够正常访问外部的变量,block有个变量捕获...

网友评论

      本文标题:OC基础 Runtime-isa (2)

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