对象、super、isa、class 和 SuperClass 的理解

本文详细介绍了Objective-C中对象的isa、superclass、class的概念及用法,包括对象的分类(实例对象、类对象、元类对象)、isa和superclass的指向、类方法调用流程、类信息存储位置等。还探讨了64位系统中isa指针的位运算以及类本质的结构体结构。
摘要由CSDN通过智能技术生成

super

super:是编译器指示符,仅仅是一个标志,并不是指针,仅仅是标志的当前对象去调用父类的方法,本质还是当前对象调用。

 super的本质:其实还是当前对象去调用,只不过让当前对象去调用父类方法, super不是父类对象,指的是父类方法。

superclass

superclass:获取方法调用者的父类

class

class:获取方法调用者的类对象 

 

Q:OC中对象分类

A:总共为三类:实例对象、类对象、元类对象

  • instance对象(实例对象)
  • class对象(类对象)
  • meta-class对象(元类对象)

实例对象(instance)

  • instance对象就是通过类alloc出来的对象,每次调用alloc都会产生新的instance对象
Student *p1 = [[Student alloc] init];
Student *p2 = [[Student alloc] init];
  • p1、p2是Student的instance对象(实例对象),它们是不同的两个对象,分别占据着两块不同的内存

     

    p1、p2内存地址

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

  • isa指针
  • 其他成员变量的值
  • 实例对象不包含实现方法

类对象(Class)

NSObject *obj1 = [[NSObject alloc] init];
Class objClass1 = [obj1 class];
Class objClass2 = [NSObject class];
//class 方法返回的一直是class对象,类对象,而不是元类对象
Class objClass3 = [[NSObject class] class];
Class objClass4 = object_getClass(obj1);
NSLog(@"%p-%p-%p-%p",objClass1,objClass2,objClass3,objClass4);
  • 上述都是同一个类对象,打印出的地址相同,每个类在内存中有且只有一个class对象

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

  • isa指针
  • superclass指针
  • 类的属性信息(@property)
  • 类的实例方法信息(instance method)
  • 类的协议信息(protocol)
  • 类的成员变量信息(ivar)(成员变量类型、名称等等,不是成员变量的值)
  • ......

元类对象(meta-class)

Class metaClass = object_getClass([NSObject class]);
  • 每个类在内存中有且只有一个meta-class对象
  • meta-class对象和class对象的内存结构是一样的,但是用途不一样

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

  • isa指针
  • superclass指针
  • 类的类方法信息(class method)
  • ......

方法说明

1.Class objc_getClass(const char *aClassName)

  • 1> 传入字符串类名
  • 2> 返回对应的类对象

2.Class object_getClass(id obj)

  • 1> 传入的obj可能是instance对象、class对象、meta-class对象
  • 2> 返回值
    a) 如果是instance对象,返回class对象
    b) 如果是class对象,返回meta-class对象
    c) 如果是meta-class对象,返回NSObject(基类)的meta-class对象

Q:实例对象、类对象isa指向

A:instance的isa指向class,class的isa指向meta-class

  • 当调用实例方法时,通过instance的isa找到class,最后找到实例方法的实现进行调用
  • 当调用类方法时,通过class的isa找到meta-class,最后找到类方法的实现进行调用

     

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值