内容字号:默认大号超大号

段落设置:段首缩进取消段首缩进

字体设置:切换到微软雅黑切换到宋体

Objcet-C对象分类

2018-12-03 21:10 出处:清屏网 人气: 评论(0

Object - C对象主要分为以下三种类型,具体如下:

1、实例对象(instance对象)

instance就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象(对象是否一样取决于其对应内存地址是否一样)

补充如下所示:

NSObject* objFirst = [[NSObject alloc] init];
    NSObject* objSecond = [[NSObject alloc] init];
    
    NSLog(@"objFirst对象地址:%p --- objSecond对象地址:%p", objFirst, objSecond);

运行如上代码,最终打印如下所示:

objFirst---objSecond.png

这样我们就可以说是objFirst 与 objSecond是两个不同的对象,因为占据2块不同的内存

实例对象的存储信息

  • isa指针
  • 其他成员变量

2、类对象(Class对象)

每个类的内存中有且只有一个类对象

补充如下(在上述代码基础上添加如下代码,这里传递的参数为instance对象,获取到的是instance对应的Class对象):

Class objFirstClass = [objFirst class];
    Class objSecondClass = [objSecond class];
    Class objFirst_runtime = object_getClass(objFirst);
    Class objSecond_runtime = object_getClass(objSecond);
    Class objClass = [NSObject class];//获取类对象
    
    NSLog(@"objFirstClass对象地址:%p\nobjSecondClass对象地址:%p\nobjFirst_runtime对象地址:%p\nobjSecond_runtime对象地址:%p\nobjClass对象地址:%p", objFirstClass, objSecondClass, objFirst_runtime, objSecond_runtime, objClass);
  • object_getClass 这个是runtime的函数,使用时需要导入头文件 #import <objc/runtime.h>

    运行如上代码,最终打印如下所示:

    图片.png

    可以看出,上面的Class 对象内存地址均相同,那就说明这都是同一个对象,这也验证了每个类在内存中有且只有一个Class对象

类对象的存储信息

  • isa指针
  • superClass指针
  • 类的属性信息(@property),类的对象方法信息(即 - 开头的方法method),类的协议信息(protocol),类的成员变量信息(ivar)
    • 类的成员变量信息(这里需要区分instance对象中所包含的成员变量信息)
      • insatance对象中所包含的成员信息是指对应的值(具体的值)
      • Class对象中所包含的成员信息是指对应的名称,类型等
        简单代码如下:(具体表现为 25 是在instance对象中,int 类型 _age 这些信息是在Class对象中,所以说Class对象中也是包含类的成员信息):
@interface Person : NSObject{
  
  @public
  int _age;
  
}

@end

@implementation Person

-(void)setAge:(int) age{
  
  _age = age;
}
Person* person = [[Person alloc] init];
person -> _age = 25;

3、元类对象(meta-class对象)

每个类的内存中有且只有一个元类对象

补充如下(在上述代码基础上添加如下代码,这里参数一定要是Class对象,这样获取到的才是meta-class对象):

Class objFirst_meta = object_getClass([objFirst class]);
    Class objSecond_meta = object_getClass([objSecond class]);
    Class objc_meta = object_getClass([NSObject class]);
    
    NSLog(@"\nobjFirst_meta对象地址:%p\nobjSecond_meta对象地址:%p\nobjc_meta对象地址:%p", objFirst_meta, objSecond_meta, objc_meta);

运行如上代码,最终打印如下所示:

图片.png

同样的以上对象的地址均一致,也验证了每个类在内存中有且只有一个meta - class对象

元类的存储信息

  • isa指针

  • superClass指针

  • 类方法信息(即 + 开头的方法 method)

  • 类对象/元类对象其实都是Class对象,所以他们的内存结构其实是一样的,但是用途不一样,主要体现在存贮的信息不一样,例如元类对象存贮的就是类方法信息,而类对象存储的就是类对象方法信息等。。。

  • 元类对象其实也可以看成是特殊的类对象

    用一副图很形象的可以表现出来,如下所示

    Object - C 类结构图.png

本文中的参考代码贴出如下所示,都相对比较简单:

NSLog(@"----------------instance - start--------------------------");
    //instance对象
    NSObject* objFirst = [[NSObject alloc] init];
    NSObject* objSecond = [[NSObject alloc] init];
    
    NSLog(@"objFirst对象地址:%p\nobjSecond对象地址:%p", objFirst, objSecond);
    NSLog(@"----------------instance - end--------------------------");
    
    NSLog(@"----------------Class - start--------------------------");
    //Class对象
    Class objFirstClass = [objFirst class];
    Class objSecondClass = [objSecond class];
    Class objFirst_runtime = object_getClass(objFirst);
    Class objSecond_runtime = object_getClass(objSecond);
    Class objClass = [NSObject class];//获取类对象
    
    NSLog(@"\nobjFirstClass对象地址:%p\nobjSecondClass对象地址:%p\nobjFirst_runtime对象地址:%p\nobjSecond_runtime对象地址:%p\nobjClass对象地址:%p", objFirstClass, objSecondClass, objFirst_runtime, objSecond_runtime, objClass);
    NSLog(@"----------------Class - end--------------------------");
    
    
    NSLog(@"----------------meta-class - start--------------------------");
    //这里的参数必须是类对象
    //meta-class对象
    Class objFirst_meta = object_getClass([objFirst class]);
    Class objSecond_meta = object_getClass([objSecond class]);
    Class objc_meta = object_getClass([NSObject class]);
    
    NSLog(@"\nobjFirst_meta对象地址:%p\nobjSecond_meta对象地址:%p\nobjc_meta对象地址:%p", objFirst_meta, objSecond_meta, objc_meta);
    NSLog(@"----------------meta-class - end--------------------------");
分享给小伙伴们:
本文标签: Objcet-C

相关文章

发表评论愿您的每句评论,都能给大家的生活添色彩,带来共鸣,带来思索,带来快乐。

CopyRight © 2015-2016 QingPingShan.com , All Rights Reserved.

清屏网 版权所有 豫ICP备15026204号