实例对象
通过alloc产生的出来的对象.
实例对象里面包含了
- 成员变量
没有存储方法,isa是所有实例对象都有的成员变量,因为所有对象都继承
类对象
实例对象的模板,实例对象都是依据类对象创建出来的.
typedef struct objc_class *Class;
// 类对象的本质是一个名为objc_class的结构体
runtime里面对objc_class的定义如下
struct objc_class {
Class isa;
Class super_class;
const char *name;
long version ;
long info ;
long instance_size ;
struct objc_ivar_list *ivars ;
struct objc_method_list * *methodLists
struct objc_cache *cache ;
struct objc_protocol_list *protocols;
} ;
class的本质也是结构体,里面也只有一个成员isa
类对象包含如下内容
- isa
- superclass指针
- 类的属性信息@property
- 类的对象方法信息
- 类的协议信息
- 类的成员变量信息
获得类对象
NSObject *obj = [[NSObject alloc]init];
NSObject *obj2 = [[NSObject alloc]init];
NSLog(@"%p",[obj class]);
NSLog(@"%p",[obj2 class]);
NSLog(@"%p",[NSObject class]);
NSLog(@"%p",object_getClass(obj));
2020-09-09 19:46:20.455600+0800 test2[45848:4907643] 0x7fff89cc4580
2020-09-09 19:46:20.456867+0800 test2[45848:4907643] 0x7fff89cc4580
2020-09-09 19:46:20.456976+0800 test2[45848:4907643] 0x7fff89cc4580
2020-09-09 19:46:20.457053+0800 test2[45848:4907643] 0x7fff89cc4580
元类对象
也是class类型的,其实就是特殊的类对象.
元类对象包含如下内容
- isa指针
- superclass指针
- 类的类方法信息
获取元类对象
object_getClass([NSObject class])
[NSObject class]方法获取的始终是类对象不是元类对象
元类对象和类对象的内存结构是一样的
objc_getClass('className'):传入字符串类名,返回类对象
object_getClass(obj):传入的是实例对象,返回类对象,传入类对象,返回元类对象