1. 你是否接触过OC中的反射机制?简单聊一下概念和使用
1). class反射
通过类名的字符串形式实例化对象。
Class class = NSClassFromString(@"student");
Student *stu = [[class alloc] init];
将类名变为字符串。
Class class =[Student class];
NSString *className = NSStringFromClass(class);
2). SEL的反射
通过方法的字符串形式实例化方法。
SEL selector = NSSelectorFromString(@"setName");
[stu performSelector:selector withObject:@"Mike"];
将方法变成字符串。
NSStringFromSelector(@selector*(setName:));
2. 调用方法有两种方式:
1). 直接通过方法名来调用。[person show];
2). 间接的通过SEL数据来调用 SEL aaa = @selector(show); [person performSelector:aaa];
3. +(void)initinstance 与 +(void)load两个方法的区别于比较 (小红书)
相同点:
系统都执行一次。
假如父类和子类都被调用,父类在子类之前被调用
不同点:
1)load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载所有的类,就会调用每个类的 + load 方法;
2)+initialize 这个方法会在 第一次初始化这个类之前 被调用,我们用它来初始化静态变量;
3)load 会在main()函数之前调用。initialize 则在类实例化或类方法被调用时调用;
4)如果子类中没有initialize方法,则会再次调用父类的initialize方法,类别会覆盖主类的initialize,load则不会被覆盖;
5)load顺序在 initialize之前;
6)initialize 方法的调用看起来会更合理,通常在它里面写代码比在 + load 里写更好,因为它是懒调用的,也有可能完全不被调用。类第一次被加载时,
类接收消息时,运行时会先检查 + initialize 有没有被调用过。如果没有,会在消息被处理前调用
执行的顺序:
1)initialize 最终是通过 objc_msgSend 来执行的,objc_msgSend 会执行一系列方法查找,并且 Category 的方法会覆盖类中的方法
2)load 是在被添加到 runtime 时开始执行,父类最先执行,然后是子类,最后是 Category。又因为是直接获取函数指针来执行,不会像 objc_msgSend 一样会有方法查找的过程。
``
``