对象类型并非在编译期就绑定好了,而是要在运行期查找。

id 类型,它能指代任意的 OC 对象类型。编译器假定它能响应所有消息。

对象类型 id,由于其本身已经是指针了。

在运行期检视对象类型,这一操作也叫做“类型信息查询”(introspection, “内省”),

这个特性内置于 Foundation 框架的 NSObject 协议里,凡是由公共根类(即 NSObjcet 与 NSProxy)继承而来的对象都要遵从此协议。

OC 对象的本质:每一个 OC 对象实例都是指向某块内存数据的指针。

描述 OC 对象所用的数据结构定义在运行期程序库的头文件里,id 类型本身也在定义在这里:

typedef struct objc_object {

  Class isa;   // 定义了对象所属的类,通常称为“is a”指针。

} *id;

Class 对象也定义在运行期程序库的头文件中:

此结构体存放类的“元数据”(metadata)。

typedef struct objc_class *Class;

struct objc_class {

  Class isa;    //Class  本身亦为 OC 对象。 //isa 指针所指向的类型是另外一个类,叫做“元类”(metaclass),用来表述类对象本身所具备的元数据。

  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;

};

如果对象类型无法在编译期确定,那么就应该使用类型信息查询方法来探知。

类型信息查询方法来检视类继承体系:(由于对象是动态的,这特性极为重要)

isMemberOfClass:”    判断出对象是否为某个特定类的实例,

isKindOfClass:”         判断出对象是否为某类或派生类的实例。

比较类对象是否等同的办法:

使用== 操作符,而不要使用 isEqual:方法

原因在于,类对象是“单例”(在应用程序范围内,每个类的 Class 仅有一个实例)。

某个对象可能会把其收到的所有方法都转发给另外一个对象。这样的对象叫做“代理”,此种对象均以 NSProxy 为根类。

通常情况下,如果在此种代理对象上调用 class 方法,那么返回的是代理对象本身(此类是 NSProxy 的子类),而非接受的代理的对象所属的类。然而,若改用“iKindOfClass:”这样的类型信息查询方法,那么代理对象就会把这条消息转给“接受代理的对象”。

也就是说,这条消息的返回值与直接在接受代理的对象上面查询其类型所得的结果相同。因此,这样查出来的类对象与通过 calss 方法所返回的那个类对象不同,class 方法所返回的“类表示发起代理的对象,而非接受代理的对象”。

所以尽量使用类型信息查询方法来确定对象类型,而不要直接比较类对象,因为某些对象可能实现了消息转发功能。

转载于:https://www.cnblogs.com/Pikdays/p/4371471.html

第14条:理解“类对象”的用意相关推荐

  1. vba 定义类_神通广大的类,瞬间实例多个类对象

    你已选中了添加链接的内容蓝字关注,加微信NZ9668获资料信息  VBA解决方案   系列丛书作者  头条百家平台 VBA资深创作者 _______________________________ 大 ...

  2. python中对象的特性_python中类与对象之继承,python类和对象理解,面对对象的三大特性之...

    python中类与对象之继承,python类和对象理解,面对对象的三大特性之 面对对象的三大特性之继承 1.什么是继承? 在程序中,继承指的是class与class之间的关系 继承是一种关系,必须存在 ...

  3. python基础(14)之 类和对象

    目录 Python类和对象 一.创建类 二.创建对象 三.init() 函数 四.对象方法 五.自参数 六.对象及其属性更改 七.pass语句 Python类和对象 Python 类/对象.Pytho ...

  4. Java类和对象(如何理解类和对象)

    Java类和对象 一.什么是对象? 1.什么是对象的属性? 2.什么是对象的行为 二.什么是类? 三. 类和对象的关系 四.类的定义 1.类的定义格式 2.类的定义示例 五.对象的使用 1.对象的创建 ...

  5. 如何理解类与对象、继承

    各位程序员老师好,我是一个刚接触Java的小白,大概两周前学习到了面向对象.继承.接口这一部分内容,内容比较绕,感觉很懵.今天分享一下我对这部分内容粗浅的理解. **一.类与对象:**我是从功能性上来 ...

  6. [Objective-C]哲学大师-通过共性与个性的概念来理解类与对象

    哲学大师-通过共性与个性的概念来理解类与对象 文章目录 哲学大师-通过共性与个性的概念来理解类与对象 如何理解 什么是共性与个性 怎么把理解类与对象 类与对象里面有什么 如何定义 怎么去定义一个类 定 ...

  7. iOS class深入理解: 实例对象、类对象、元类和isa指针

    你要知道的class都在这里 转载请注明出处http://blog.csdn.net/u014205968/ 深入代码理解instance.class object.metaclass 面向对象编程中 ...

  8. 理解Python中的类对象、实例对象、属性、方法

    class Animal(object): # 类对象age = 0 # 公有类属性__like = None # 私有类属性def __init__(self): # 魔法方法self.name = ...

  9. C#图解教程 第六章 深入理解类

    深入理解类 类成员 前两章阐述了9种类成员中的两种:字段和方法.本章将会介绍除事件(第14章)和运算符外的其他类成员,并讨论其特征. 成员修饰符的顺序 字段和方法的声明可以包括许多如public.pr ...

最新文章

  1. BP神经网络的线性本质的理解和剖析-卷积小白的随机世界
  2. python在中小学教学中的应用-小学信息技术教学中进行Python 编程语言教学的策略...
  3. Java书籍Top 10
  4. windows服务器部署jar包
  5. Intel视频处理与分析技术栈和架构纵览
  6. jep290涉及jdk版本_JDK 14 – JEP 361从预览中切换表达式
  7. JDK8新特性(十三)之Optional
  8. BIM 360 Docs API在操作欧洲数据中心内容的一些调整
  9. 打印机扫描找不到计算机用户名,打印机扫描到pc显示不可用 打印机扫描到pc显示不可用的解决方法...
  10. 如果读书无用,那为什么还要读书
  11. mfc对话框ok没效果_利用PS制作逼真双重曝光效果案例演示,合成紫色城市建筑风格海报图片...
  12. 数十万csdn小白难题:自学软件测试,学到什么程度可以出去找工作啊?京东offer不要了,换字节跳动....
  13. 10没有基于策略的qos_电力通信 | 基于智能光网络系统的配用电业务承载方案研究...
  14. 立秋至,暑难消,e安在线信息安全快讯
  15. 用Python写个桌面挂件,手把手带你做只桌面宠物~
  16. java1.7 apk 签名_【keytool jarsigner工具的使用】Android 使用JDK1.7的工具 进行APK文件的签名,以及keystore文件的使用...
  17. java微信群发_java调用个人微信接口进行群发好友,群发群
  18. pfa100_PFA 的主要性能
  19. java 界面线性布局_布局Layouts之LinearLayout线性布局
  20. 热学仿真模型助力深层次理解半导体器件物理和优化制备工艺

热门文章

  1. MyBatis(一)——基本架构、CURD、ResultMap、日志、分页
  2. 北斗导航 | 基于卡尔曼滤波的IMU+GNSS的组合导航(附Matlab源代码)
  3. 北斗导航 | 大规模点云地图的自动化构建(高翔:SLAM十四讲)
  4. Qt学习(五):TCP通信
  5. windows下利用sox批量将PCM转为WAV
  6. mxnet基础到提高(35)-ndarray
  7. 趣学python3(41)--利用交集计算词类标签的分类
  8. 【Python】面向小白的Python可视化教程,超全的!
  9. NLP面试时,项目经历要怎么讲?
  10. 【深度学习】保姆级教程,用PyTorch构建第一个神经网络