ivar layout 相關知識點

1 認識ASC碼字符的表達方式

ASC碼是最開始的編碼方式,用了7bit(0-127)來表示英文下的全部字符,固然如今ASC碼進行了擴展,如想知道具體能夠查看 百度百科,如今學習一下在代碼中表達字符的方式:ios

//'a'表示英文字符中a,這種字符是比較正常的字符,其次還有轉義字符'\n'
char a = 'a';
NSLog(@"char:%c", a); // a

//上面是使用字符自己形象來表達這個字符的,可是咱們也客戶使用數字來表示。若是用數字來表示咱們能夠使用十進制、八進制、十六進制。
char a = '\012';//八進制
char b = '\x12';//十六進制
char c = '\123';十進制

//錯誤的方式
char d = '123'; //這種方式是錯誤的,由於在字符表中沒有‘123’這樣的字符,這時候換成int類型。

複製代碼

2 認識計算ivar layout 的函數

  • 計算strong ivar的佈局:class_getIvarLayoutgit

  • 計算weak ivar 的局部:class_getWeakIvarLayoutgithub

這兩個函數返回的值都是const uint8_t *,能夠理解爲一個數組,數組中的元素類型是:uint8_t【用8個bit位表示的非負數整數,由於第一位表示符號位,因此這個類型的取值範圍是:0-127】,咱們從數組中取出來每個uint8_t元素,高四位表示爲非strong【weak】 的個數,低四位表示 strong【weak】 的個數。數組中用\x00來表示結束位,這樣咱們能夠經過while循環來獲得strong【weak】的引用的下標。咱們獲取的下標都是class_copyIvarList數組中的下標。數組

- (NSMutableIndexSet *)ivarLayout:(const uint8_t *)strongLayout {
    NSMutableIndexSet *layout = [NSMutableIndexSet indexSet];
    NSUInteger index = 0;
    
    while (*strongLayout != '\x00') {
        //非strong
        uint8_t upper = (*strongLayout & 0xf0) >> 4;
        
        //strong
        uint8_t lower = (*strongLayout & 0x0f);
        
        //獲得strong引用的初始index
        index += upper;
        
        //將strong的index,而且放在layout中
        [layout addIndexesInRange:NSMakeRange(index, lower)];
        
        //將index指向最後一位strong引用
        index += lower;
        
        //指針+1
        strongLayout ++;
    }
    return layout;
}

複製代碼

代碼例子:bash

@interface Person : NSObject
{
    __strong id name;
    __weak id a;
    __unsafe_unretained id c; //不計算在 weak layout
    int g; //不計算在weak layout
    __strong id h;
    // _autoreleasing 不支持
    //__autoreleasing id j;
}
複製代碼

補充

  • 若是上面的文章解釋不清楚,能夠下載代碼本身運行一下。代碼
相關文章
相關標籤/搜索