类的剖析

政策的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

  1. p/x SWPerson变量与函数.class 得到类政策内存地址0x0000000100008apple tv0e8,xapplication/4gx格式化输出类政策的内存地apple watch
  2. p/x 0x00000001000080c0 & 0x00007fapple watchfappearanceffffffff8将类政策的首地址(isa指针地址)0x00000001000080c0和ISA_MASK做与操作,得到了一个新的内存地址0x00000001000080c0
  3. po 0x00000001000080c0 打印这个地址数据,得到了SWPerson

0x00000001000080e80x00000001000080c0 是两个不同的地址,0x00000001000080e8 是类地址,而appointment 0x00000001000080c0 地址对应的类就叫元类apple store

小结

  • 元类是体系编译器自动创建的,和用户不要紧
  • 实例政策的isa指向类,类政策的isa指向元类
  • 类名和它相关类即元类名是相同的(只需相关元类才有类名)

isa走源码年代训练怎么样位图剖析

Apple 官方 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 承继 SWPersonSWPerson 承继 NSObjectNSObject的父类是nil
  • SWTeacher 元类承继 SWPerson 元类,SWPerson 承继根元类根元类承继NSObject

类结构剖析

在 oc 政策的实质与isa 中application发现isaClass类型的,Classobjc_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_objectobjc_object里边只需一个成员变量isaisa详细是效果现已根究过。下面的三个成员变量详细的效果还不知道,怎样去根究它呢?类的地址是知道的,那么就根据上面根究过的首地址+偏移值来获取里边的成员变量的地址,然后获取值。但是偏移值需求知道其时变量之前的悉数成员变量的巨细

  • 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,将会拿到这个类的methodsprope源码编辑器编程猫下载rtiesprotocolsdeepCopyro等等信息

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 -&gtapple; 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