ivar layout 相关知识点

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;
}
复制代码

补充

  • 如果上面的文章解释不清楚,可以下载代码自己运行一下。代码
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值