12-类的本质、类的启动过程(load, initialize)、SEL类型

类的本质


  • 本质
    • 类其实也是一个 对象, 这个对象会在这个类第一次被使用的时候创建, 一个类再内存中只有一份类对象
    • 只要有了类对象, 将来就可以通过类对象来创建实例对象
    • 实例对象中有一个isa指针, 指向创建自己的类对象
    • 类对象中保存了当前对象所有的对象方法, 当给一个实例对象发送消息的时候, 会根据实例对象中的isa指针去对应的类对象中查找
  • 如何获取类对象: [实例对象 class]/ [类名 class];
  • 类对象的应用场景:
    • 1用于创建实例对象
    • 2用于调用类方法

类的启动过程


  • load方法:
    • 只要程序启动就会将所有类的代码加载到内存中, 放到代码区
    • load方法会在当前类被 加载到内存 的时候调用, 有且仅会 调用一次
    • 如果存在继承关系, 会 先调用父类的load方法, 再调用子类的load方法
  • initialize方法:
    • 当前类第一次被使用的时候就会调用(创建类对象的时候)
    • initialize方法在整个程序的运行过程中只会被 调用一次, 无论使用多少次这个类都只会调用一次
    • initialize用于对某一个类进行 一次性的初始化
    • initializeload一样, 如果存在继承关系, 会 先调用父类的initialize, 再调用子类的initialize

SEL类型


三种用法

    1. 配合对象/类来 检查 对象/类中有没有实现某一个方法
SEL sel = @selector(setAge:);
Person *p = [Person new];
// 判断p对象中有没有实现-号开头的setAge:方法
// 如果P对象实现了setAge:方法那么就会返回YES
// 如果P对象没有实现setAge:方法那么就会返回NO
BOOL flag = [p respondsToSelector:sel];
NSLog(@"flag = %i", flag);
  • 2.配合对象/类来 调用某一个SEL方法
SEL sel = @selector(demo);
Person *p = [Person new];
// 调用p对象中sel类型对应的方法
[p performSelector:sel];
    
SEL sel1 = @selector(signalWithNumber:);
// withObject: 需要传递的参数
// 注意: 如果通过performSelector调用有参数的方法, 那么参数必须是对象类型,
// 也就是说方法的形参必须接受的是一个对象, 因为withObject只能传递一个对象
[p performSelector:sel1 withObject:@"13838383438"];
    
SEL sel2 = @selector(setAge:);
[p performSelector:sel2 withObject:@(5)];
NSLog(@"age = %i", p.age);
    
// 注意:performSelector最多只能传递2个参数
SEL sel3 = @selector(sendMessageWithNumber:andContent:);
[p performSelector:sel3 withObject:@"138383438" withObject:@"abcdefg"];
  • 3.配合对象 将SEL类型作为方法的形参
Car *c = [Car new];
SEL sel = @selector(run);
    
Person *p = [Person new];
[p makeObject:c andSel:sel];// 调用传入对象的指定方法, 此处是c的run方法
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 5,859评论 0 9
  • 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的转载 这篇文章完全是基于南峰子老师博客的...
    西木阅读 30,721评论 33 466
  • 一、Runtime简介 Runtime简称运行时。OC就是运行时机制,也就是在运行时候的一些机制,其中最主要的是消...
    林安530阅读 4,678评论 0 2
  • Objective-C中有两个NSObject,一个是NSObject类,另一个是NSObject协议。而其中NS...
    ScaryMonsterLyn阅读 4,079评论 0 2
  • 文 | KOI 总有一首歌词,刻在你的心里 总有一句歌词,是唱给你听的 我是KOI,无所事事,正在听歌 有没有你心...
    田优秀阅读 2,990评论 5 5