iOS底層探索--聯合體與位域

小谷iOS底層博客合集程序員

  • 在探索iOS底層的時候,有個程序員都不陌生的isa,isa的實現用到了 聯合體位域markdown

  • 其實在日常iOS開發中基本沒有書寫聯合體位域的狀況,,不過不表明咱們能夠不會啊。。我以爲到達看得懂的地步就行了!!post

1. 聯合體

  • 我經常使用到一種結構體類型 strut,有一種和結構體比較類似的結構,叫共用體,也稱聯合體
union 共用體名 {
    成員列表
}
複製代碼
  • 聯合體結構體的區別:

結構體中每一個成員都會獨立一塊內存,相互不影響!而聯合體全部成員公用一塊內存!牽一而動全身!atom

做爲一個程序員來講,仍是代碼比較直觀!!spa

1.1 聯合體特徵1

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

1.2 聯合體特徵2

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

聯合體的話知道這個就足夠了!!內存

2. 位域

2.1 使用bool值證實

  • 位域的話仍是比較好理解的!
  • 舉個例子:假如我有一輛拖拉機!這個拖拉機的方向只能 前、後、左、右、(不能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;

複製代碼
  • 咱們打印這個tractor

  • 而後咱們發現了:咱們能夠看到 frontbackleftright各佔一個字節,但其實咱們只須要一個二進制就能夠表現出來,也就是 0 或則 1 就能夠!!開發

  • 這個時候咱們就可使用位域來看一下了get

2.2 使用位域證實

上代碼

@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;
複製代碼

看結果:

這段代碼的意思是:我畫了個圖:

基於這種結構就是位域

相關文章
相關標籤/搜索