1.
》对象的第一个属性必然是isa,因为其来自父类
(控制台打印:p/x 进行16进制的打印 p/t 二进制打印 p/o 八进制打印 p/d 十进制打印)
x/4gx object 读取内存中前4个
》isa的初始化和指向分析
2.对象的本质
》结构体
》函数名就是函数指针
3.类可以创建多个吗
》对象可以创建多个,类在整个内存中只有一个
类在内存中只有一份:这几种方式获取到的类,都是一样的
Class class1 = [LGPerson class];
Class class2 = [LGPerson alloc].class;
Class class3 = object_getClass([LGPerson alloc]);
Class class4 = [LGPerson alloc].class;
》打印类的内存结构
x/4gx YQPerson.class
类的内存,第一位,po之后打印出来类名LGPerson??
第二位,是superclass指向的内存
但LGPerson类的isa指针,怎么可能还指向LGPerson呢,所以此处的LGPerson其实是元类
系统同时创建了一个元类,由编译器创建
》superclass
类的superclass指向父类,根类的superclass指向nil
类的isa指向元类,元类的superclass指向父元类,根元类的superclass指向NSObject
4.对象的本质
》结构体
》clang -rewrite-objc fileName.m -o resultFile.cpp 生成c++文件
查看LGPerson的结构体
》函数编译之后,系统会默认增加两个参数:LGPerson * self,SEL _cmd 。
所以在方法内部,可以获取到self
》objc_setProperty set方法
不同类型的数用不同符号表示:c表示char,i表示int ivar_getTypeEncoding
》元类中存储类方法
5.成员变量
》@interface {
NSString *p; // 成员变量
LGTeacher *t;// 实例变量,特殊的成员变量(经过实例化之后的成员变量)
}