iOS 基础 第三天(0808)

0808

分类的使用注意
  • 分类只可以增加方法,不可以增加成员变量
  • 分类可以访问原来类中声明的成员变量
  • 分类可以重新实现原来类中的方法,但是会覆盖掉原来的方法,会导致原来的方法没法再使用
  • 方法调用的优先级:分类-->原来类-->父类
  • 多个分类包含同一方法的话,看后编译的方法覆盖先编译的方法

类的本质
  • 一个对象或者类本身调用 class 方法都可以获取到内存中的类对象.类在内存中只有一份,类的实例对象,实例化一个就再内存中为该对象分配一份内存.成员变量是和对象在一起的,方法是和类在一起的.
  • 有时我们可以通过一个类已经实例化的对象来获取到该对象所属的类,进而来完成类的alloc和init 如下图:


类的加载过程
  • 先加载父类再加载子类.在类(分类也一样)被加载的时候会调用load方法,当类第一次加载会调用initialize,但如果分类里面也有initialize方法的话则只调用分类里的方法.load方法无论怎么都调用,以为只要程序一启动类就会加载,一旦加载就会调用load方法,只会调用一次,所以load方法是不管类和分类的.并且,加载的时候先加载原始类再加载分类

如下图所示:


deacription方法
  • description 有类方法和对象方法,下面的两点都是对对象的deacription方法来说的.
  • 以我的经验,description可以获取到NSURL对应的NSString类型的url链接地址
  • 我们可以重写description方法来达到我们想输出的内容的目的.调用NSLog(@"%@", p)就会调用description对象方法.所以不要在重写的description方法里调用NSLog(@"%@", p)方法,不然会死循环.

NSLog(@"%@", p)这个是打印指针p所指向的对象的类名+对象地址

NSLog(@"%p", &p)这个是打印指针p的地址

NSLog(@"%p", p)这个是打印指针p所指向的对象的地址

如下图所示:

当调用类的desription方法的时候只会显示类的名称


输出日志增强


SEL(类和SEL都是运行时的一些机制)
  • SEL对应的是方法的地址。一个对象调用一个方法的时候,首先将方法包装成SEL类型的数据,然后根据SEL数据找到对应的方法地址,最后根据方法地址调用对应的方法.调用过方法一次之后SEL就会被缓存,下次再调用的时候就会直接方法找到来执行.

如下图所示:

每一个方法内部都有一个cmd,这个cmd是个SEL类型的,代表当前方法,打印一下即可看出来

如下图所示:

原文地址:https://www.cnblogs.com/lyandy/p/5116818.html