ios面试经历

从3月份开始,陆陆续续面试了有10多家了。

今天准备记录一下这些面试的问题和我自己的心路历程。

第一家面试是猎头推荐的,那时候也没有做好面试准备,也有好久没有准备面试那些东西,本来以为自己能回答出来,不曾想,一败涂地啊。因为是高级ios开发,所以面试过程中问的问题就开始偏runtime机制甚至是ios源码部分了。归纳一下主要有以下部分:

1:UIViewController的生命周期。

如果使用StoryBoard或者XIB文件,周期如下:initWithCoder:-awakeFromNib

如果是使用纯码调用:首先执行initWithNibName:bundle-loadView 在重写loadView方法的时候,不要调用父类的方法。

之后统一执行:viewDidLoad-viewWillAppear-viewWillLayoutSubviews-viewDidLayoutSubviews-viewDidAppear 页面显示完成。

当视图切换时:viewWillDisappear-viewDidDisappear

视图销毁:dealloc-didReceiveMemoryWarning(内存不足时执行)

答案可参考:https://www.jianshu.com/p/d60b388b19f5

2:在OC中,一个方法调用的是怎样实现的?

在 Objective-C 中,所有的 [obj message] 都会转换为 objc_msgSend(obj, @selector(message));然后obj在runtime对应的结构体是obj_object,其中包含isa指针。系统会根据该isa指针找到obj对应的class,然后在对应的class的方法缓存中通过hash查找找到对应的实现方法,如果没有,那么会在当前class的methodLists找到对应的方法,如果没有,那么通过class结构体obj_class中的superclass指针找到对应的superClass,在对应的superClass的methodLists中找到同名方法,如果还是没有找到,那么系统会调用消息转发流程。

答案可参考:https://www.jianshu.com/p/114782a909f9

消息转发流程:如果一个类不响应某个具体的方法,在进入消息转发流程前还有两个时机处理,

  • resolveInstanceMethod
  • forwardingTargetForSelector
答案可参考:https://www.jianshu.com/p/5127ce0628be

如果上述两个时机都无法处理消息,则会进入消息转发流程,这个流程的关键方法是:

- (NSMethodSignature *)methodSignatureForSelector:(SEL)aSelector

- (void)forwardInvocation:(NSInvocation *)anInvocation

3:多线程中,多读单写,要怎么实现?

可以使用dispatch_group将多写异步操作组合起来,dispatch_group_async()实现多个异步操作,dispatch_group_notify()实现最后单写操作。

也可以使用:dispatch_barrier_async栅栏方法

答案可参考:https://blog.csdn.net/liuyinghui523/article/details/50618092

4:多线程中,怎样保证多个线程访问一个成员变量的安全?比如多个线程访问array,然后为array赋值,如何保证线程安全?

主要考察的是线程安全,同步锁方面的知识。

可参考:http://www.cocoachina.com/ios/20171218/21570.html

5:如何实现两个线程交替执行?

可参考:https://blog.csdn.net/u014220518/article/details/80536995

6:AFNetworking和SDWebImage源码实现机制是怎样的?

AFNetworking3.X简化了原2.X的AFHTTPRequestOperationManager部分,目前3.X核心部分包括:

网络通信模块(AFURLSessionManager、AFHTTPSessionManger)网络状态监听模块(Reachability)网络通信安全策略模块(Security)网络通信信息序列化/反序列化模块(Serialization)对于iOS UIKit库的扩展(UIKit) ios面试经历_第1张图片

可参考:https://www.jianshu.com/p/856f0e26279d

7:函数递归调用是怎样的?例如:1 1 2 3 5 8 13 ...用伪函数实现。

f(n){

if(n==1 || n ==2 ){

return 1} else {

return f(n-1)+f(n-2)}}

主要部分是跳出函数调用部分。

8:对一个数组去重有哪些方法?

  • 数据循环比较去重
  • 通过集合NSSet去重
  • 通过字典NSDictionary去重
  • 利用keyValue去重

9:UITableView的优化机制有哪些 ?

tableView的优化主要涉及的是cell的重用机制,视图渲染原理及CPU和GPU的工作原理。

10:本地化数据存储你用过哪些?查询两个表的同一个字段的数据Sql怎么写?去重的sql怎么写?

11:如何在block内部修改外部局部变量的值?为什么?

12:在滑动页面时,定时器卡顿如何解决?

13:KVO是什么?

14:页面卡顿原理是什么?如何解决?

15:在C语言中如何定义一个类?OC语言是如何转化为C语言的面向过程的呢?

16:iOS11有哪些特性?

17:你是怎么理解HTTPS的?延伸到对称加密和非对称加密,建立连接过程和数据请求部分。

18:NSOperationQueue实现了什么?和GCD的区别。

19:__weak和__block有什么区别?

20:[[[objc method1] method2] method3:[objc method4]]这些方法的调用顺序是怎样的?

21:

    NSTimer *timer = [[NSTimer alloc] initWithFireDate:[NSDate date] interval:1 target:self selector:@selector(fireTimer) userInfo:nil repeats:NO];

    [timer fire];

timer为什么无效?

22:

  [UIImage imageNamed:@""];

    [UIImage imageWithContentsOfFile:@""];

这两个方法有什么区别?

23:OC中有私有方法和私有变量吗?

先记录这些,下周补全面试答案

你可能感兴趣的:(ios面试经历)