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

2021-03-10  本文已影响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
上一篇下一篇

猜你喜欢

热点阅读