类的剖析
政策的isa指向的是类,万物皆政策,类也是个政策,类里边也有isa,那么类isa是指向哪个类呢?这个类便是苹果定义的元类
元类(metaClass)
存在即合理,元类存在的意义在哪里?
int main(int argc, char * argv[]) {
@autoreleasepool {
Class class1 = [SWPerson class];
Class class2 = [SWPapple storeerson alloc].class;
Cl变量泵ass class3 = object_getClass([SWPerson alloc]);
Class class4 = [SWPerson alloc].class;
NSLog(Apple@"n-%p-appearn-%p-n-%p-n-源码之家%p-",class1,class2,class3,class4);
}
return
}
效果:
-0x100009510-
-0x100009510-
-0x源码本钱100009510-
-0x100009510-
- 类政策的地址都是相同的,内存中每一个类只需一块内存,和一般的政策有明显的差异
用来获取类信息的掩码,将isa的地址&、ISA_MASK,可以解析得到类的信息,ISA_MASK是体系定义的,不同架构不同,我在objc4源码内拿到的
x8架构图用什么软件做6_64:define ISA_MASK 0x00007fAPPfffffffff8ULL
arm64:define ISA_MASK 0x0000000ffffffff8ULL
arm64(simulatapple watchors):define ISA_MASK 0x007ffffffffffff8ULL
- p/x SWPerson变量与函数.class 得到类政策内存地址0x0000000100008apple tv0e8,xapplication/4gx格式化输出类政策的内存地apple watch址
- p/x 0x00000001000080c0 & 0x00007fapple watchfappearanceffffffff8将类政策的首地址(isa指针地址)0x00000001000080c0和ISA_MASK做与操作,得到了一个新的内存地址0x00000001000080c0
- po 0x00000001000080c0 打印这个地址数据,得到了SWPerson
0x00000001000080e8 和 0x00000001000080c0 是两个不同的地址,0x00000001000080e8 是类地址,而appointment 0x00000001000080c0 地址对应的类就叫元类apple store
小结
- 元类是体系编译器自动创建的,和用户不要紧
- 实例政策的isa指向类,类政策的isa指向元类
- 类名和它相关类即元类名是相同的(只需相关元类才有类名)
isa走源码年代训练怎么样位图剖析
- 实例政策的isa –> 类政策
- 类政策的appleisa–> 元类
- 元类isa–> 根元类
- 根元架构图用什么软件做类的isa–> 根元类(指向自己)
类 元类 根元类承继图
int main(int argc, char * argv[]) {
@autoreleasepool {
Class tMetaClass = object_getClass(SWTeacher.class); //SWTeacher 的元类
Class tMetaSuperClasapple pays = class_getSuperclass(tMeapp id注册taClass);//SWTeacher 的元类的父类
Clasapples pMetaClass = object_getClass(SWPerson.class); //SWPerson 的元类
Class pMeatSuperClass = class_getSuperclass(pMetaClass);/Apple/SWPerson 的元类的父类
Class nMetaClass = object_getClass(NSObject.cla变量类型有哪些ss); //NSObjectapple的元类
Class nSuperClass = class_getSuperclass(NSObject.clapple官网ass);//NSObject的父类
Class nMetaSuperClass = class_getSuperc变量值lass(nMetaClass);//NSObject的元类的父类
NSLog(@"SWTeacapple idher-%p",SWTeacher.class);
NSLog(@"SWPer变量的定义son-%p",SWP变量类型有哪些erson.class);
NSLog(@"NSObject-%p",NSObject.class);
NSLog(@"%@ - %p - %@ - %p",tMetaClass,tM变量泵etaClass,tMetaSuperClass,tMetaSuperClass);
NSLog(@"%@ - %p - %@ - %p",pMetaClass,pMetaClass,pMeat源码网站SuperClass,pMeatSuperClass);
NSLog(@"%@ - %p - %@ - %p",nMetaCl源码年代训练怎么样ass,nMetaClass,nMetaSuperClass架构师和程序员的差异,nMetaSuperClass);
}
return
}
SWTeacher-0x100009618
SWPersoappstoren-0x100009528
NSObject-0x7fff8deb3118
SWTeacher - 0x1000095f0 - SWPerson - 0x100009APP500
SWPerson - 0x100009500 - NSObject - 0x7fff8deb30f0
NSObje变量类型有哪些ct - 0x7fff8deb30f0 - NSObject - 0x7fff8deb3118
- - (null)
NSOb源码之家ject的父类打印的效果是nil。SWTeacher
的元类的父类是 SWPerson
的元类(SWPerson
的元类的地址和SWPerson
类的地址不相同)。SWPerson
的元类的父类是 NSObject
的元类,NSObject
的元类的父类架构图用什么软件做是NSObject
(和NSObject
类的地址相同)
-
SWTeacher
承继SWPerson
,SWPerson
承继NSObject
,NSObject
的父类是nil
-
SWTeacher
元类承继SWPerson
元类,SWPerson
承继根元类
,根元类
承继NSObject
类结构剖析
在 oc 政策的实质与isa 中application发现isa
是Class
类型的,Class
是objc_class*
,objc_class
是一架构师需求把握哪些常识个结构体,悉数的Class底层完成都是objc_cl架构师薪酬一月多少ass
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
//下面是一些办法省掉
};
objc_class
承继objc_object
,objc_object
里边只需一个成员变量isa
,isa
详细是效果现已根究过。下面的三个成员变量详细的效果还不知道,怎样去根究它呢?类的地址是知道的,那么就根据上面根究过的首地址+偏移值
来获取里边的成员变量的地址,然后获取值。但是偏移值需求知道其时变量之前的悉数成员变量的巨细
-
isa
结构体指针占8字节 -
Class superclass
也是结构体指针占8字节 -
cache_t cache
是结构体类型的巨细,由结构体内成员变量选择, 16字节 -
class_data_bits_t bits
知道前面三个成员变量巨细,就可以得到bits的地址
cache_t
内存巨细
typedef unsigned long uintptr_t;
#if __LP64__
typ源码是什么意思edef uint32_t mask_t; // x86_64 & arm64 asm are less变量的拼音 efficient with 16-bits
#else
typedef uint16_t mask_t;
#endif
struct cache_t {
private:
explicit_atomic<uintptr_t> _bucketsAndMaybeMask; // 8
union {
struct {
explicit_atomic<mask_t> _maybeMask; // 4
#if __LP64__
uint16_t _flags; // 2
#endif
uint16_t _occupied; // 2
};
explicit_atomic<preoptapp id注册_cache_t *> _originalPreoptCache; //8
};
//下面是一些办法省掉
};
cache_t
是结构体类型,有两个成员变量_bucketsAndMaybeMask
和一个联合变量名体
-
_bucketsAndMa变量ybeMask
是 uintptapproachr_t无符长整型占8字节 - 联合体里边有两个成员变量结构体和
_originalPreoptCache
,联合体的内存巨细由成员变量中app store的最大变量类型选择 -
_originalPreoptCache
是结构体指针架构设计占8字节 - 结构体中有
_maybeMask
,_flags
,_occupi架构是什么意思ed
。_maybeMask
是uint32_t占 4字节,_flags
和_occupied
是uint16_t 各占2字节,结构体巨细是8字节 -
cache_t
的内存巨细架构师需求把握哪些常识是 8+8 或者是8+4+2+2都是16字节
小结:通过获取class_rw_t*
类型的data源码是什么意思()Apple
,将会拿到这个类的methods
、prope源码编辑器编程猫下载rties
、protocols
、deepCopy
、ro
等等信息
class_rw_t
struct class_rw_t {
// Be warned that Symbolication knows the变量泵 layout of this structure.
uint3变量泵2_t fla架构图gs;
uint16_t witness架构师需求把握哪些常识;
#if SUPPORT_INDEXED_ISA
uin源码编辑器t16_t index;
#endif
//省掉了部分代码
explicit架构图用什么软件做_atomic<uintptr_t> ro_or_rw_ext;
Class firstSubclass;
Class nextSibli架构设计ngClass;
class_rw_ext_t *deepCoappreciatepy(const class_ro_t *ro) {
return extAlloc(ro, true);
}
const method_array_t methods() const {
auto v = get_ro_or_rwe架构师和程序员的差异();
if (v.is<class_rw_ext_t *>()) {
return v.get<class_rw_ext_t *>(&ro_or_rw_ext架构图)->applemethods;
} else {
return method_array_t{v.get<con变量的指针其含义是指该变量的st class_ro_t *>(&ro_or_rw_ext)apple id密码重置->baseMethods()};
}
}
const property_array_t properties() const {
auto v = get_ro_or_rwe();
if (v.is<clasappetites_rw_ext_t *>()) {
return v.get<class_rw_ext_t *>(&ro_or_rw_ext)->properties;
}APP else {
return property_arraapproachy_t{v.变量与函数get<const class_ro_t *>(&ro_or_rw源码本钱_ext)->baseProApplepapple watcherties};
}
}
cons源码编辑器编程猫t prappleotocol_array_t protocols() const {
auto v = get_ro_or_rw架构师薪酬一月多少e();
if (v.is<class_rw_ext_t *>(源码是什么意思)) {
return v.get<claappointmentss_rw_ext_t *>(&ro_or_rw_变量与函数ext)->protocols;
} else {
return prot架构师和程序员的差异ocol_array_t{v.get<const class_ro_t *>(&ro_or_rw_ext)->baseProtocols};
}
}
};
类的特征
成变量与函数员变量获取流程:NSObject.classapple tv -> class_data_bits_t -> class_rw_t -> property_array_t -> property_list_t -> pr源码买卖网站源码operty_t
类的实例办法
实例办法获取流appear程:NSObject.class -> class_data_bits_t -> class_rw_t -> method_array_t源码编辑器 -> method_l架构是什么意思ist变量的拼音_t -> method_t -> big
成员变量
ivars
获取流程源码:NSObject.class -> class_data_bits_t -> class_rw_t -> class_ro_t ->apple; ivar_list_t -> iva源码年代r_t
变量的底层完成是ivar_t
。存储在class_r源码年代训练怎么样o_t
中的变量列表里
体系会给特征自动生成一个带_
特征名变量,存储在class_r源码年代训练怎么样o_t
中的变量列表里
类办法
类办法获取流程:NSObjec源码之家t.class -> metaClass -> class_data_bits_t -> class_rw_t -> method_array_t变量名的命名规矩 -> method_list_t -> method_t -> bi源码买卖网站源码g
定论:类办法存储在元类中
的办法列表里
源码
检app store查的源码是objc4-818.2.tar.gz