美文网首页
007--iOS底层 - 类的结构(属性的赋值取值)

007--iOS底层 - 类的结构(属性的赋值取值)

作者: Mr_wick | 来源:发表于2021-06-30 15:43 被阅读0次

引言

上篇文章,通过lldb调试,找到了类的属性、成员变量、实例方法和类方法的存放位置。本文将讲述属性的补充内容。
demo

firstSubclass

上次我们在lldb调试过程中,发现这个firstSubclass都是为nil的情况,接下来,我们将讲述为什么。
上代码(QLDog继承于QLPerson):

@interface QLDog : QLPerson

@end

main.m文件
int main(int argc, const char * argv[]) {
    @autoreleasepool {
        
        QLPerson *person = [QLPerson alloc];
        
        NSLog(@"%@",person);

    }
    return 0;
}

操作过程如下:

image.png
根据上图操作流程,我们可以看到,firstSubclass开始为nil,打印了QLDog地址后,firstSubclass才有值,为什么会这样呢?
因为这是一个懒加载的过程,在用到的时候才有值

属性的赋值

此处我们通过clang来探索属性的修饰对属性赋值的影响。
上代码:
QLPerson.h

@interface QLPerson : NSObject{
    NSString *fullName;
}

@property (nonatomic,copy) NSString *nickName;
@property (nonatomic,strong) NSString *strongNickName;
@property (nonatomic) NSString *noaNickName;
@property (atomic) NSString *aNickName;

@property (nonatomic,assign) NSInteger age;
@property (nonatomic) NSInteger noaAge;
@property (atomic) NSInteger aAge;


@end

通过clangQLPerson.m编译成QLPerson.cpp,请参考我之前这篇文章OC代码转C/CPP代码

xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc QLPerson.m -o QLPerson.cpp

得到的QLPerson.cpp拖入工程,不参与编译。在搜索框输入QLPerson_IMPL得到

image.png image.png

1、声明的属性,都被被注释,取而代之的是,将属性转成了成员变量+getter setter 方法
2、原成员变量fullName不变
3、方法test1 test2变成了_I_QLPerson_test1(QLPerson * self, SEL _cmd),括号内参数即可看出OC的方法调用会默认传id self,SEL _cmd两个参数。

property的getter setter方法

由上图,我们可以看到所有属性的getter和setter方法,有些不一样,代码看起来有些乱,我将多余的类型强转去掉后,简化后代码如下:

image.png
1、属性通过getter方法得到数据,方法内通过对象地址+偏移量指向的内存得到。
2、属性的赋值分两种:①setProperty()、②对象地址+偏移量
3、对比QLPerson.h中的属性声明,nickName的赋值是setProperty(),其余均为self + 偏移量。因为nickName用了copy修饰。相关证明及其setter方法重定向到setproperty()的过程,请到LLVM源码中查看。最终在CGObjC.cpp的第858行得到 image.png

总结

setProperty()objc中的运行过程,以后有空再补充。

相关文章

  • 007--iOS底层 - 类的结构(属性的赋值取值)

    引言 上篇文章,通过lldb调试,找到了类的属性、成员变量、实例方法和类方法的存放位置。本文将讲述属性的补充内容。...

  • 结构赋值

    数组的结构赋值 按顺序排列,取值由位置决定 对象的机构赋值 变量名与属性名必须相同才能取值,先找到同名属性,在赋值...

  • iOS 底层 day07 Category上的关联对象

    一、本文解答的问题 1. 为什么类中添加属性可以赋值取值,而分类中添加的属性却不能直接赋值取值呢? 假设添加属性的...

  • ES6 学习(对象解构篇)

    - 对象解构赋值 ** 对象的取值是由属性取值对象的值也可以设置默认值(见数组结构篇) ** 解构例子 如果变量名...

  • C语言数据结构-链表大解剖

    链表抽象结构解析 引用、解引用、指针、链表赋值取值 链表抽象结构解析 引用、解引用、指针、链表赋值取值

  • 10. 类和对象

    类的属性可以使用 var 声明变量,可以使用 val 声明常量。属性的引用可以用 (.)符号来实现。属性取值和赋值...

  • iOS KVC的几种情况简析

    kvc取值时,需注意的几点问题; 讲解一下kvc各种问题,包括基础属性赋值,属性对象的属性赋值,私有属性赋值 以及...

  • 属性的判断、取值、赋值

    1、判断节点是否拥有某个属性,方法是: boolean b = node.hasProperty(property...

  • KVC的使用

    一、作用1.能够对对象的私有成员进行取值赋值2.对数值和结构体型的属性进行的打包解包处理二、赋值赋值过程:1.先找...

  • Python的property

    取值和赋值 类Actress中有两个成员变量name和age。在外部对类的成员变量的操作,主要包括取值和赋值。简单...

网友评论

      本文标题:007--iOS底层 - 类的结构(属性的赋值取值)

      本文链接:https://www.haomeiwen.com/subject/iizlultx.html