【iOS】找工做的面试题集锦

 

  1. 你在开发过程当中经常使用到哪些定时器,定时器时间会有偏差吗,若是有,为何会有偏差?

  iOS中常NSTimer、CADisplayLink、GCD定时器,其中NSTimer、CADisplayLink基于NSRunLoop实现,故存在偏差,GCD定时器只依赖系统内核,相对一前二者是比较准时的。html

  偏差缘由是:与NSRunLoop机制有关, 由于RunLoop每跑完一次圈再去检查当前累计时间是否已经达到定时设置的间隔时间,若是未达到,RunLoop将进入下一轮任务,待任务结束以后再去检查当前累计时间,而此时的累计时间可能已经超过了定时器的间隔时间,故会存在偏差。ios

   参考《iOS常见三种定时器-NSTimer、CADisplayLink、GCD定时器》面试

  2. NSTimer、CADisplayLink会产生循环引用吗?若是会,你是如何解决的?

  若是直接使用,会产生循环引用问题。能够增长一个中间类,给这个类添加一个用weak修饰的id 类型target属性,并重写中间类的消息转发方法。实现以下代码:算法

  声明文件.h:json

#import <Foundation/Foundation.h>

@interface LXProxy : NSProxy
+ (instancetype)proxyWithTarget:(id)target;

@end

  实现文件.m缓存

#import "LXProxy.h"

@interface LXProxy ()

/** weak target*/
@property (nonatomic, weak) id target;

@end

@implementation LXProxy

+ (instancetype)proxyWithTarget:(id)target{
LXProxy *proxy = [LXProxy alloc];
proxy.target = target;

return proxy;

}

- (NSMethodSignature *)methodSignatureForSelector:(SEL)sel{
return [self.target methodSignatureForSelector:sel];

}

- (void)forwardInvocation:(NSInvocation *)invocation{
[invocation invokeWithTarget:self.target];

}

@end

  调用代码:安全

_timer = [NSTimer scheduledTimerWithTimeInterval:2 target:[LXProxy proxyWithTarget:self] selector:@selector(test) userInfo:nil repeats:YES];

  3. 对Runtime有了解吗,Runtime的方法查找过程是什么样的?有哪些实际应用?

  runtime是OC动态语言的运行时机制,OC的方法调用最后都转成了runtime的objc_msgSend函数。网络

  3.1 Runtime消息传递:

  1. 经过哈希算法,先从方法缓存中查找,若是命中,调用方法结束流程
  2. 若是缓存中没有,则去当前类的方法列表中查找,若是命中,调用方法,加入当前方法缓存中,结束流程
  3. 若是当前类没有对应方法,则去逐级父类方法列表中查找,若是命中,调用方法,加入当前方法缓存中,结束流程
  4. 若是方法都不存在,进入方法动态解析,转入消息转发流程。

  注:对于已经排序好的方法列表,采用二分查算法查找对应的执行函数,对应没有排序的列表,采用通常遍历方法查找对应执行函数。函数

  3.2 消息转发流程:

  1. 调用动态解析方法resolveClassMethod:(SEL)sel,若是动态添加方法(调用class_addMethod函数)并返回YES,则结束流程
  2. 若是上一步没有实现动态添加方法,不管返回Yes仍是No,都会调用消息接受者重定向forwardingTargetForSelector方法,若是返回重定向接受者,则当前流程结束
  3. 若是返回上一步nil,则会调用methodSignatureForSelector获取函数的参数和返回值类型,同时调用forwardInvocation消息通知当前对象。
  4. 若是上一步返回nil,消息没法处理,App crash。

  3.3 继承关系:

  1. 实例对象(isntance)的isa指针指向类对象(class),类对象的存放实例方法(-方法)
  2. 类对象(class)的isa指针指向其元类对象(meta), 元类对象存放类方法(+方法)
  3. 根类对象(root class)的isa指针指向根元类对象(root meta),superclass指针指向nil.
  4. 根元类对象(root meta)的isa指针指向本身,superclass指针根类对象(root class)

  由此可知, 实例方法(-方法)查找是沿着其superclass指针逐级父类查找,终于根类对象(root class)。而类方法(+方法)查找是沿着其superclass指针逐级父类(meta)查找,终于根类对象(root class),若是根类对象存在同名实例方法,则会调用同名实例方法oop

  3.4 Runtime实际运用:

  1. 给NSTimer定时器声明一个中间类Proxy(消息转发)
  2. 经过rumtime动态获取类的全部属性(json转model、可归档类对属性的归档及解归档操做)
  3. 反射机制(NSClassFromString, CTMediator原理)
  4. 交换系统方法(好比交换viewController生命周期方法,从而进行统一埋点等操做)
  5. 给分类添加属性(经过关联对象,实现getter, setter方法)

  4. +load和+initlize调用时机?如今有一个类,给其添加了多个分类,而且每一个实现分类都实现了相同的类方法(好比+test),在调用这个方法时,会调用到哪一个分类?

  1. +initialize 方法,会在第一次初始化这个类以前被调用,咱们用它来初始化静态变量。+load 方法会在加载类的时候就被调用,也就是 ios 应用启动的时候,就会加载全部的类,就会调用每一个类的 +load 方法。initialize 方法相似一个懒加载,若是没有使用这个类,那么系统默认不会去调用这个方法,且默认只加载一次,且调用发生在 +init 方法以前。

  2. 调用最后参与编译的分类的test方法。缘由:Xcode在编译时根据buildPhases->Compile Sources里面的从上至下顺序编译的,经过压栈的方式将多个分类压栈,且根据后进先出的原则,后编译的会被先调用(插入顶部添加,即[methodLists insertObject:category_method atIndex:0]。因此objc_msgSend遍历方法列表查找SEL 对应的IMP时,会先找到最后参与编译的分类)当objc_msgSend找到方法并调用以后,结束传递消息,因此就造成了所谓的“覆盖”。

  5. App冷启动优化?

  App冷启动优化方案博客很是之多,归纳总结大体以下:

  1. pre-main优化:减小动态静态库,合并动态库,移除废弃第三方库及所依赖的系统库,二进制重排(抖音优化方案)
  2. runtime对类的注册,类对象的初始化,load方法加载阶段:精简类,合并分类,移除废弃分类等等
  3. main函数以后,推迟对三方库注册及延时调用耗时操做函数。能够经过Instruments-->Time Profiler: 性能分析,定位耗时函数

  6. UIView和CALayer有了解吗,UI卡顿缘由是什么,什么是离屏渲染,为何会产生离屏渲染,如何避免触发离屏渲染?

  1. UIView和CALayer遵循单一职责原则,UIView负责事件处理,参与响应链,为CALayer提供显示的内容,CALayer负责内容显示。
  2. UI卡顿缘由:参考

  三、网络工程面试题

  1. HTTPS和HTTP有什么区别,HTTPS加密过程是什么样的,对称加密和非对称解密各有什么优缺点?

  HTTPS协议是由SSL/TLS+HTTP协议构建的可进行加密传输、身份认证的网络协议,要比http协议安全
  HTTPS协议的主要做用能够分为两种:一种是创建一个信息安全通道,来保证数据传输的安全;另外一种就是确认网站的真实性。

  HTTP与HTTPS的区别,详细介绍

  2. TCP和UDP有什么区别,TCP是可靠传输吗,若是保证其可靠性?

  2.1 TCP和UDP区别:

  1. TCP面向链接(如打电话要先拨号创建链接);UDP是无链接的,即发送数据以前不须要创建链接
  2. TCP提供可靠的服务。也就是说,经过TCP链接传送的数据,无差错,不丢失,不重复,且按序到达;UDP尽最大努力交付,即不保证可靠交付
  3. TCP面向字节流,其实是TCP把数据当作一连串无结构的字节流;UDP是面向报文的UDP没有拥塞控制,所以网络出现拥塞不会使源主机的发送速率下降(对实时应用颇有用,如IP电话,实时视频会议等)
  4. 每一条TCP链接只能是点到点的;UDP支持一对一,一对多,多对一和多对多的交互通讯
  5. TCP首部开销20字节;UDP的首部开销小,只有8个字节
  6. TCP的逻辑通讯信道是全双工的可靠信道,UDP则是不可靠信道
    参考1

  2.2 TCP可靠性:

  1. 校验和
  2. 确认应答与序列号
  3. 超时重传
  4. 链接管理
  5. 流量控制
  6. 拥塞控制(慢启动,拥塞避免,快重传,快恢复)
    参考2

  3. 如何针对App弱网状况优化

  参考:浅谈APP弱网优化

相关文章
相关标签/搜索