美文网首页
iOS面试2

iOS面试2

作者: 咸鱼有只喵 | 来源:发表于2019-03-05 15:26 被阅读0次

【基础编码】

1.将excel中的字母标号转为数字

   A -> 1

   B -> 2

   C -> 3

   ...

   Z -> 26

   AA -> 27

   AB -> 28

2. 二分查找实现

3 .合并两个有序的单链表

4.从[K, K+N-1] 共N个连续整数中随机取出N-1个数乱序后放入数组, 请找出被去除的一个

5.从给定整数数组中找出最大的N个

6.给定一个整数矩阵,每行按照升序排列,每列按升序排列,写一个函数从矩阵中快速查找某个元素

7.用单向链表表示十进制整数(每个节点是十进制的一位,链表头是高位), 求两个整数的和

8.给定一个单链表,将相邻的两个节点交换

例如 1->2->3->4 返回  2->1->4->3

9. 二叉树的前序遍历,在此基础上如何得到后序遍历的结果

9.写出hittest具体实现过程

【基础知识 】

内存管理 property  copy weak ,property和ivar的区别,使用区别和场景,可能遇到的问题

Runtime (****),应用

Runloop (****),原理,mode,常用场景,与多线程的关系,如何获取FPS

AutoreleasePool (****)

KVO KVC (**),KVO原理,触发场景,如何正确使用

Block  (***),循环引用的产生,如何解决,如何自动检测

GCD 多线程 Runloop (****)

Timer  (***)

生命周期 (*)

ResponsderChain (**),如何扩大点击区域

MessageSend 转发 动态协议 (*),转发过程,proxy

持久化的实现方式 (*)不同方式的优缺点,使用场景

CoreAnimation 3-Layers  (**),实现原理

UIView CALayer shapeLayer TextLayer (***)

layoutSubview和drawRect

CPU render和GPU render

容器类 遍历 (*)

Category (**)

【业务能力】

UI设计 (题目1-2个)

Autolayout (性能)

App共享

CoreAnimation 3D CABaseAnimation Property

自己参与过模块的设计 深度

网络层 图片下载

debug 技巧 breakpoint , LLDB

方案对比选择

深度广度 http协议 https 等

【项目优化 】(根据项目经验)

内存

卡顿 (列表滑动 动画)

电量 流量

启动速度 加载速度

包大小

instrument使用

【架构能力】

设计题 (网络库 图片下载库 持久化)

设计模式 MVVM 工厂 单例 观察者

【开源框架】

AFNetworking

JSONModel

SDWebImage

ReactiveCocoa

POP

算法和数据结构:

哈希表原理, 为什么比数组快, 如何设计哈希映射, 如何解决哈希冲突

LRU Cache

快速排序

依次输出无序数组中第一个比它大的数,如果没有输出-1

比如[3,8,6,2,4,9,10],输出[8,9,9,4,9,10,-1]

iOS中的常见设计模式, 比如NSArray的抽象工厂, NSUndoManager的命令模式  事件响应的责任链模式

基础知识:(网络 编译过程 )

什么是TCP的慢启动 和拥塞控制

https是怎么保证传输信息安全的

什么是DNS 怎么解决DNS劫持

iOS中怎么发起一个网络请求 (socket CF NSURL)

心跳保活机制

HTTP 协议理解

1. 简单 HTTP GET POST 格式, 以及GET POST 的区别

2 深入理解 Cache 策略, 命中本地Cache( 304, 不发请求),没有命中 200

Cache-Control: Public Private no-Cache max-age no-store

Expires

Date

Last-Modified

Etags

If-Modified-Since

If-None-Match

Obj-C+iOS:

Level1

1 Copy的理解

1)OC 属性描述,什么情况使用 Copy。

2)以下的拷贝方式,是否产生新的对象

NSArray copy mutableCopy  深拷贝

NSMutableArray copy mutableCopy  深拷贝

NSArray * array = @[@1, @2];

NSArray * arrayCopy = [array copy];  // 和array指向同一个对象

其他都产生新的对象

注 深拷贝方式:

[[NSMutableArray alloc] initWithArray:array copyItems:YES]

[[NSArray alloc] initWithArray:array copyItems:YES]

2. 如何重写一个类的isEqual:方法

回答:一般需要同时重写这个类的hash方法,如果isEqual:方法判定两个对象相等,那么其hash方法也必须返回同一个值。系统调用isEqual方法的时机有哪些,例如array或set中是否包含一个对象,往set中添加一个对象等集合相关操作。

3.一个CGRect类型的变量分配在内存的哪个区域?如何分配到堆上?

回答:默认在栈上,NSValue类的valueWithCGRect:方法或者NSString的NSStringFromCGrect方法,或者直接将CGRect类型的变量定义为一个类的property

4. viewDidLoad、viewWillAppear、viewDidAppear、viewWillDisappear和viewDidDisappear的生命周期,viewController之间进行切换时各函数调用的顺序

Level2

问题:如何自定义一个异步的NSOperation?

回答:自定义子类,维护ready/excuting/finished状态,重写isReady/isExecuting/isFinished/isConcurrent方法,重写start方法,自定义finish方法中手动触发kvo状态变化的通知,特别注意的两点,一是重写isReady方法时候一定要考虑到当前operation可能存在的依赖,如果存在任何一个依赖没有finish,该方法应该返回NO,二是在自定义的finish方法中需要手动调用当前operation的completionBlock

问题:为什么ARC下抛出异常可能会导致内存泄漏?

回答:ARC是通过增加retain/release代码来帮助程序员管理内存的,但是当一个异常被抛出的时候,代码执行的流程改变,很可能导致一部分release代码永远执行不到,造成内存泄漏

问题:Objective C中的哪些特性利用了运行时机制

回答:可以讲很多,比如category、KVO、KVC、关联对象、method-swizzling等

问题:系统如何实现UIScrollView的,如何自己实现一个类似的

回答:通过两个UIView模拟实现,监听手势并修改contentView的bounds

问题:在ARC下,什么时候需要自己手动创建autorelease pool?

你写的程序不是基于UI framework, 例如命令行项目;

你写的循环创建了大量临时对象 -> 你需要在循环体内创建一个autorelease pool block并且在每次循环结束之前处理那些autoreleased对象. 在循环中使用autorelease pool block可以降低内存峰值

你创建了一个新线程,如果你的应用程序或者线程是要长期运行的并且有可能产生大量autoreleased对象, 你应该使用autorelease pool blocks,长期在后台中运行的任务, 方法

问题:layoutsubviews方法的调用时机?如何在当前runloop中立即调用layoutsubviews方法?(不允许直接手动调用)

问题:ARC环境下dealloc方法中系统会自动做哪些事情?

问题:如果在一个类中定义的一个方法打断点时候发现此方法并没有执行到,可能是因为什么原因?

问题:可以在一个类的分类中KVO本类的属性吗?为什么?比如在UIImageView的分类中KVO image属性

OC中常用的线程同步方法, 如何处理资源竞争. 死锁(尽量说项目中遇到的case...大路货不算数) 常见的锁, 自旋锁为什么快

如何处理两个需要通信的页面之间的耦合关系  delegate,notification,block对比, 使用的场景,优缺点.  有没有用过页面路由系统, 设计一个路由系统.

关于 hitTest 和 responder chain :

问:一个 UIButton 的点击事件没有触发,原因可能有哪些?

答:可能是绑定的事件类型不对,alpha,userInteractionEnabled设置问题,也可能是其不在父view.frame范围内,或其他可能的原因,发散题;

追问:为什么不在父view.frame内会导致事件响应不到?怎么解决?

答:引出 hitTest 的细节。

问:从 UIButton 到 NSObject 的继承链。

答:UIButton -> UIControl -> UIView -> UIResponder -> NSObject.

追问:中间这些类的主要作用有哪些,进而可引出事件响应,CALayer 等概念。

UIView 的父类是?UIViewController 的父类是?为什么要这么设计?

答:其父类都是 UIResponder,进而引出其对 responder chain 的理解。

追问:如果一个View的嵌套层次较深,怎么在当前类拿到其上游某个ViewController?

答:顺着 responder chain 迭代找到其上游 vc。

追问:针对类似某个模块 VC 和 View 之间的嵌套耦合,你们是怎么处理的,怎么避免,有没好的解决方案?

答:发散题。

输出结果:

- (void)viewDidLoad {

   [super viewDidLoad];

   dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{

       NSLog(@"5");

   });

   dispatch_async(dispatch_get_main_queue(), ^{

       NSLog(@"4");

   });

   [self performSelector:@selector(test2)];

   [self performSelector:@selector(test3) withObject:nil afterDelay:0];

   dispatch_async(dispatch_get_global_queue(DISPATCH_QUEUE_PRIORITY_DEFAULT, 0), ^{

       NSLog(@"6");

   });

   [self test1];

}

答案:2 1 6 3 5 4

可追问直接调用和performSelector的区别 以及afterDelay之后cancelPreviousPerformRequestsWithTarget一定可以取消吗?

问题:这段代码输出什么?

- (void)viewDidLoad {

   [super viewDidLoad];

   NSLog(@"1");

   dispatch_queue_t serialQueue = dispatch_queue_create("这是一个串行队列", DISPATCH_QUEUE_SERIAL);

   dispatch_sync(serialQueue, ^{

       NSLog(@"2");

   });

   NSLog(@"3");

}

Level3

1.问题:为什么__weak修饰的指针,在对象被释放后会被置为nil?可以如何实现这个功能?

回答:在Objective-C的运行时环境中,维护了一种weak表,这张哈希表用对象的首地址作为键,将由若干个__weak修饰的指针自身的地址组成的数组作为值。当一个Objective-C对象被释放后,通过这个对象的起始地址来找到所有指向它的__weak指针,并将它们指向nil。

2.问题:NSDictionary的key类型一定是NSString吗,可以是自定义的对象吗?如果是自定义对象需要做哪些事情?

回答:不一定是NSString类型,任何遵循了NSCopying协议的类的对象都可以。还需要实现copyWithZone:方法,还需要重写hash和isEqual方法。

追问:为什么一定要遵循NSCopying协议,苹果为何如此设计?

回答:防止传入的对象被改变,假如传入的key1是可变类型,那么假设取value的时候外部对key1 copy了一下变成了key2,因为key1可能会改变,那么判断[key1 isEqualTo:key2]就会返回NO,也就无法获取到key1对应的value了。

追问:为什么一定要重写hash和isEqual方法,这两个方法有什么区别和联系?

回答:这涉及到NSDictionary实现的数据结构,一个哈希表通过hash函数的返回值,每个hash值对应一个hash桶(bucket),key的hash方法返回的值被用来计算bucket所在的位置(通过mod计算),计算出bucket之后,就从node1开始遍历,直到[nodeX->key isEqual: key]为止,再取出nodeX->value。可以看到这两个方法是结合起来确定某对象唯一标示的一种方式,hash方法可以认为是对集合中存储对象的粗略筛选,而isEqual是更加严格的筛选,要保证两个obj如果isEqual为YES,那么两个obj的hash值必须一样。如何对于一个对象obj1 copy之后的obj2如果hash值不相同或者isEqual为NO,那么就会出现能存但是不能取的问题。

3. iOS和Mac OS的垃圾回收机制区别? 为什么iOS不用GC? GC和ARC的优缺点对比, 常见的GC分类, GC策略

4. Swift的看法, 动态静态语言对比, 强弱类型对比. 如果在项目中已经用上Swift的话, 可以追问 OC&Swift混编的坑, Swift对项目带来的实际优势,缺点.(一定要从实践中获得, 百度的不算)

设计架构,优化:

设计一个和UITableView类似的TTT ableView(假设接口都一样),需要具备cell复用的功能

- 如何维护reusable identifier和cell的关系

- 当reusable identifier非常多、cell也非常多的时候,如何避免内存占用过多

设计一个定时更新下载任务进度的view

- 如何创建一个异步线程的runloop并添加一个timer

- 如何尽可能让进度更新的更平滑

图片加载 加载+缓存 (LRU mmap)

用户通讯录 模块 存储 更新

视频缓存模块

设计一个弹窗管理模块:要求,任意两个弹窗不允许重叠,上一个弹窗消失后自动展示下一个,并且可以控制顺序

现有项目的工程架构, 有什么缺点, 如果基于现有的业务场景重新设计, 你会怎么做. 与现有项目架构的优势.

自己在iOS技术掌握和应用方面有哪些擅长和不足,最感兴趣和深入研究的技术点是?

相关文章

网友评论

      本文标题:iOS面试2

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