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;
}複製程式碼
補充
- 如果上面的文章解釋不清楚,可以下載程式碼自己執行一下。程式碼