OC对象的分类

instance对象(实例对象)

通过类alloc出来的对象,每次调用alloc都会生成新的instance对象

/*
	obj1、obj2是NSObject的instance对象(实例对象)
	它们是不同的2个对象,分别占用着2块不同的内存
*/
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];

(lldb) po obj1
<NSObject: 0x100672580>

(lldb) po obj2
<NSObject: 0x100622ab0>

instance对象在内存中存储的信息

1、isa指针(基本所有的对象都包含isa指针,因为基本都是继承至NSObject)

2、其他的成员变量

class对象(类对象)

/*
	class11、class12、class21、class22、class31都是NSObject的class对象(类对象)
	它们都是同一个对象。每个类在内存中有且只有一个class对象(在内存中都是指向同一内存地址)
*/
NSObject *obj1 = [[NSObject alloc] init];
NSObject *obj2 = [[NSObject alloc] init];
        
Class class11 = [obj1 class];
Class class12 = object_getClass(obj1);
        
Class class21 = [obj2 class];
Class class22 = object_getClass(obj2);
        
Class class31 = [NSObject class];
        
NSLog(@"\nclass11:%p; \nclass12:%p; \nclass21:%p; \nclass22:%p; \nclass31:%p;",class11,class12,class21,class22,class31);

class11:0x7fffa7882140; 
class12:0x7fffa7882140; 
class21:0x7fffa7882140; 
class22:0x7fffa7882140; 
class31:0x7fffa7882140;

class对象在内存中存储的信息主要包括

1、isa指针

2、superclass指针

3、类的属性信息(@property)、类的对象方法信息(instance method)、类的协议信息(protocol)、类的成员变量信息(ivar)…

meta-class对象(元类对象)

/*
	metaClass1是NSObject的meta-class对象(元类对象)
	每个类在内存中有且仅有一个meta-class对象
	meta-class对象和class对象的内存结构是一样的(都是class类型),但是用途不一样
*/
NSObject *obj = [[NSObject alloc] init];
//  class方法返回的一直是class对象(类对象)
[obj class] == [NSObject class] == [[NSObject class] class];
//  将实例对象作为参数传入,获得类对象
Class class1 = object_getClass(obj);
//  将类对象作为参数传入,获得元类对象
Class metaClass1 = object_getClass([NSObject class]);

NSLog(@"\nclass1:%p; \nmetaClass1:%p;",class1,metaClass1);

class1:0x7fffa7882140; 
metaClass1:0x7fffa78820f0;

meta-class对象在内存中存储的信息主要包括

1、isa指针

2、superclass指针

3、类的类方法信息(class method) …

//	objClass是class对象,并不是meta-class对象
Class objClass = [[NSObject class] class];
//	判断是否为meta-class对象(元类对象)
BOOL result = class_isMetaClass([NSObject class]);

//	根据字符串返回相应的class对象(类对象)
Class objc_getClass(const char *aClassName)
{
    if (!aClassName) return Nil;

    // NO unconnected, YES class handler
    return look_up_class(aClassName, NO, YES);
}

/*
	传入instance对象,返回class对象
	传入class对象,返回meta-class对象
	传入meta-class对象,返回基类的meta-class对象
*/
Class object_getClass(id obj)
{
    if (obj) return obj->getIsa();
    else return Nil;
}

PS 此文为学习 李明杰 老师的 iOS底层原理课程所写笔记
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值