ivar layout 相關知識點

愛玩愛鬧發表於2018-12-05

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

ASC碼是最開始的編碼方式,用了7bit(0-127)來表示英文下的所有字元,當然現在ASC碼進行了擴充套件,如想知道具體可以檢視 百度百科,現在學習一下在程式碼中表達字元的方式:

//'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_getIvarLayout

  • 計算weak ivar 的區域性:class_getWeakIvarLayout

這兩個函式返回的值都是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;

}複製程式碼

程式碼例子:

@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;

}複製程式碼

補充

  • 如果上面的文章解釋不清楚,可以下載程式碼自己執行一下。程式碼

來源:https://juejin.im/post/5c076f2de51d451d97172a48

相關文章