美文网首页
iOS基础 Runtime-isa (1)Runtime-isa

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

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

    Runtime 基础 (1)isa详解
    OC是一门动态性比较强的编辑语言,OC的动态性是由Runtime API来支撑的
    Runtime:运行时
    //提供了一套C 语言的API,源码由C/C++/汇编语言编写(开源)

    OC消息机制:
    消息机制转发流程

    isa: ISA_MASK
    instance的 isa& ISA_MASK -> class class isa &ISA_MASK - >meta-class

    在arm64架构之前,isa就是一个普通指针,存储着Class,meta-Class的内存地址

    在arm64架构之后,对isa进行了优化,变成了一个共用体(union)结构,还使用位域来存储更多信息

    补充知识;
    位运算 &
    举例说明
    0011 &1111 = 0011
    作用:可以用来取出特定的位 比如0011想获取第二位(1),那么就给它与上一个(除了那一位为1,其他位全部是0,也就是(0010))结果为0010
    同理比如0001想获取第二位(0),那么就给它与上一个(除了那一位为1,其他位全部是0,也就是(0010))结果为0000,就得到了想要获得的那位数

    Runtime-isa 取值
    可以在条件面前加两个!即可以转化为bool类型

    #import <Foundation/Foundation.h>
    
    NS_ASSUME_NONNULL_BEGIN
    
    @interface ZKPerson : NSObject
    -(void)setTall:(BOOL)tall;
    -(void)setRich:(BOOL)rich;
    -(void)setHandsome:(BOOL)handsome;
    -(BOOL)tall;
    -(BOOL)rich;
    -(BOOL)handsome;
    @end
    .m
    #import "ZKPerson.h"
    @interface ZKPerson()
    {
        char _isTallRichHandsome;
    }
    @end
    @implementation ZKPerson
    
    
    - (instancetype)init
    {
        self = [super init];
        if (self) {
            _isTallRichHandsome = 0b00000111;
        }
        return self;
    }
    
    - (void)setTall:(BOOL)tall
    {
        
    }
    - (BOOL)tall
    {
        return !!(_isTallRichHandsome &1);
    }
    - (void)setRich:(BOOL)rich
    {}
    - (BOOL)rich
    {
        return !!(_isTallRichHandsome &2);
    }
    - (void)setHandsome:(BOOL)handsome
    {
    }
    - (BOOL)handsome
    {
        return !!(_isTallRichHandsome &4);
    }
    

    .m

     ZKPerson *zk = [[ZKPerson alloc]init];
            
     NSLog(@"%d,%d,%d",zk.tall,zk.rich,zk.handsome);
    
    //打印结果:2021-03-09 21:48:43.607529+0800 DoBlock[1058:2701236] 1,1,1
    
    

    补充知识点:掩码:按位与运算

    以上代码优化,(主要是宏定义)

    //掩码:按位与运算
    //#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
    

    相关文章

      网友评论

          本文标题:iOS基础 Runtime-isa (1)Runtime-isa

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