美文网首页
iOS非常规面试题

iOS非常规面试题

作者: w冷兔w | 来源:发表于2020-04-16 10:55 被阅读0次

1.dispatch_once是如何在多线程情况下保证生成对象的唯一性?

答案:dispatch_once用原子性操作block执行完成标记位,同时用信号量确保只有一个线程执行block,等block执行完再唤醒所有等待中的线程。dispatch_once常被用于创建单例、swizzeld method等功能

所有OC对象都继承与NSObject吗,id是什么?

答案: 除了NSObject之外的另一个基类——NSProxy. NSProxy是一个虚类,它可以被继承,并重写下面两个方法来实现消息转发到另一个实例

  • (void)forwardInvocation:(NSInvocation *)invocation;
  • (NSMethodSignature *)methodSignatureForSelector:(SEL)sel ;
    id数据类型可存储任何类型的对象。从某种意义说,它是一般对象类型。

initalize 和load方法的区别
1、相同点

1).load和initialize会被自动调用,不能手动调用它们。
2).子类实现了load和initialize的话,会隐式调用父类的load和initialize方法。
3).load和initialize方法内部使用了锁,因此它们是线程安全的。

2、不同点

1).调用顺序不同,以main函数为分界,+load方法在main函数之前执行,+initialize在main函数之后执行。 initalize是通过消息发送机制objc_msgSend方式调用的,而load是类、分类等等开始加进内存中就开始调用。根据方法地址imp直接调用.
2).子类中没有实现+load方法的话,不会调用父类的+load方法;而子类如果没有实现+initialize方法的话,也会自动调用父类的+initialize方法。
3). 先执行父类的load 再执行子类的load 再执行分类的load.
4).+load方法是在类被装在进来的时候就会调用,+initialize在第一次给某个类发送消息时调用(比如实例化一个对象),并且只会调用一次,是懒加载模式,如果这个类一直没有使用,就不回调用到+initialize方法。

四、使用场景

1.+load一般是用来交换方法Method Swizzle,由于它是线程安全的,而且一定会调用且只会调用一次,通常在使用UrlRouter的时候注册类的时候也在+load方法中注册。
2.+initialize方法主要用来对一些不方便在编译期初始化的对象进行赋值,或者说对一些静态常量进行初始化操作。

相关文章

网友评论

      本文标题:iOS非常规面试题

      本文链接:https://www.haomeiwen.com/subject/pqyzphtx.html