在探索OC对象本质之前,先了解一下clang
Clang
-
clang
是⼀个由Apple主导编写,基于LLVM的C/C++/Objective-C编译器 - 主要用于底层编译,将oc文件转换成
c++
文件,方便理解底层原理
对象本质
@interface Animal : NSObject
@property (nonatomic, copy) NSString *type;
@property (nonatomic, assign) NSInteger *age;
@end
@implementation Animal
@end
- 在
main
文件中,自定义一个类Animal
,有两个属性type,name
- 通过终端,利用
clang
将main.m
文件,转换成main.cpp
文件
clang -rewrite-objc main.m -o main.cpp
struct NSObject_IMPL {
Class isa;
};
struct Animal_IMPL {
struct NSObject_IMPL NSObject_IVARS;
NSString *_type;
NSInteger *_age;
};
- 由上图可知对象的本质实际就是
结构体
探索OC中的set
方法
![](https://img.haomeiwen.com/i12233399/926cd2fbb6c485a8.png)
- 然后我们前往
objc4
源码中搜索objc_setProperty
这个方法
objc_setProperty方法
-
由上图可知 objc_setProperty 实际上是一个中转站,接着reallySetProperty
reallySetProperty
由此我们得出:
所有的set
方法都会调用objc_setProperty
方法——》reallySetProperty
方法
网友评论