小谷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;
複製代碼
看結果:
這段代碼的意思是:我畫了個圖:
基於這種結構就是位域