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