小谷iOS底层博客合集程序员
在探索iOS底层的时候,有个程序员都不陌生的isa,isa的实现用到了 联合体
与位域
markdown
其实在日常iOS开发中基本没有书写联合体
与位域
的状况,,不过不表明咱们能够不会啊。。我以为到达看得懂的地步就行了!!post
strut
,有一种和结构体比较类似的结构,叫共用体
,也称联合体
。union 共用体名 {
成员列表
}
复制代码
联合体
与结构体
的区别:结构体中每一个成员都会独立一块内存,相互不影响!而联合体全部成员公用一块内存!牵一而动全身!atom
做为一个程序员来讲,仍是代码比较直观!!spa
union XGXS {
int a; //4个字节
short b; //2个字节
char c; //1个字节
} xgxs;
//结果
xgxs.a = 2;
xgxs.b = 4;
xgxs.c = 'c';
NSLog(@"union size: %lu - %lu",sizeof(xgxs), sizeof(union XGXS));
//union size: 4 - 4
复制代码
** 得出结论1:联合体的内存是成员所需的最大内存那个。 **code
xgxs.a = 2;
NSLog(@"%d---%d---%c",xgxs.a,xgxs.b,xgxs.c);//2---2---
xgxs.b = 4;
NSLog(@"%d---%d---%c",xgxs.a,xgxs.b,xgxs.c);//4---4---
xgxs.c = 'c';
NSLog(@"%d---%d---%c",xgxs.a,xgxs.b,xgxs.c);//99---99---c
复制代码
** 得出结论2:每次改变联合体中的成员,其余成员会受到影响、即联合体成员之间是相互互斥的 **orm
联合体的话知道这个就足够了!!内存
不能45°仰望天空哈
)@interface XGTractor : NSObject
@property (nonatomic, assign) BOOL front;
@property (nonatomic, assign) BOOL back;
@property (nonatomic, assign) BOOL left;
@property (nonatomic, assign) BOOL right;
@end
@implementation XGTractor
@end
XGTractor *tractor = [[XGTractor alloc] init];
tractor.back = YES;
tractor.front = YES;
tractor.left = YES;
tractor.right = YES;
复制代码
而后咱们发现了:咱们能够看到 front
、back
、left
、right
各占一个字节,但其实咱们只须要一个二进制就能够表现出来,也就是 0 或则 1 就能够!!开发
这个时候咱们就可使用位域来看一下了get
上代码
@interface XGTractor2 : NSObject
- (void)setFront:(BOOL)isFront;
- (BOOL)isFront;
- (void)setBack:(BOOL)isBack;
- (BOOL)isBack;
- (void)setLeft:(BOOL)isLeft;
- (BOOL)isLeft;
- (void)setRight:(BOOL)isRight;
- (BOOL)isRight;
@end
#define XGDirectionFrontMask (1 << 0)
#define XGDirectionBackMask (1 << 1)
#define XGDirectionLeftMask (1 << 2)
#define XGDirectionRightMask (1 << 3)
@interface XGTractor2 () {
union {
char bits;
struct {
char front: 1;
char back: 1;
char left: 1;
char right: 1;
};
} _direction;
}
@end
@implementation XGTractor2
- (instancetype)init {
self = [super init];
if (self) {
_direction.bits = 0b00000000;
}
return self;
}
- (void)setFront:(BOOL)isFront {
_direction.front = isFront;
}
- (BOOL)isFront {
return !!(_direction.bits & XGDirectionFrontMask);
}
- (void)setBack:(BOOL)isBack {
_direction.back = isBack;
}
- (BOOL)isBack {
return !!(_direction.back & XGDirectionBackMask);
}
- (void)setLeft:(BOOL)isLeft {
_direction.left = isLeft;
}
- (BOOL)isLeft {
return !!(_direction.left & XGDirectionLeftMask);
}
- (void)setRight:(BOOL)isRight {
_direction.right = isRight;
}
- (BOOL)isRight {
return !!(_direction.left & XGDirectionLeftMask);
}
@end
复制代码
XGTractor2 *tr2 = [[XGTractor2 alloc] init];
tr2.front = 1;
tr2.back = 1;
tr2.left = 1;
tr2.right = 1;
复制代码
看结果:
这段代码的意思是:我画了个图:
基于这种结构就是位域