一,我们平时写的oc文件可以通过clang编译生成底层cpp文件,可以清楚看到类在底层的结构
iPhoneSimulator.sdk根据你xcode的版本修改
clang -x objective-c -rewrite-objc -isysroot /Applications/Xcode.app/Contents/Developer/Platforms/iPhoneSimulator.platform/Developer/SDKs/iPhoneSimulator.sdk xxx.m
二,我们知道类在底层就是结构体objc_class,通过查看objc源码,来看下类的结构
1,继承objc_object,objc_object结构体里有ISA指针,所有所有类都有ISA指针
2,superclass ,父类指针
3,cache,缓存
4,bits,类方法,协议,属性等
5,data(),通过该方法获取bits的具体内容
struct objc_class : objc_object {
// Class ISA;
Class superclass;
cache_t cache; // formerly cache pointer and vtable
class_data_bits_t bits; // class_rw_t * plus custom rr/alloc flags
class_rw_t *data() const {
return bits.data();
}
void setData(class_rw_t *newData) {
bits.setData(newData);
}
void setInfo(uint32_t set) {
ASSERT(isFuture() || isRealized());
data()->setFlags(set);
}
void clearInfo(uint32_t clear) {
ASSERT(isFuture() || isRealized());
data()->clearFlags(clear);
}
.......
}
网友评论