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