iOS面试题2018

过完年到现在一直都在维护之前的项目,工作不是很忙,所以在学一些前端的知识,准备慢慢过渡到前端开发。和iOS开发对比起来还挺好理解的,特别是css上的一些东西,不过js上的就很陌生了,确实和OC或者Swift都不一样,得从头开始学起。都说从项目中学习东西比较快,我也这么认为的,然后准备找一个从iOS过渡到前端的工作,从网上搜罗了一些面试题,复习一下,做好准备。

 

1.面试题一

GCD相关的一个例子:

 1     dispatch_async(dispatch_get_global_queue(0, 0), ^{
 2         NSLog(@"1");//任务1
 3         dispatch_sync(dispatch_get_main_queue(), ^{
 4             NSLog(@"2");//任务2
 5         });
 6         NSLog(@"3");//任务3
 7     });
 8     NSLog(@"4");//任务4
 9     int a = 0;
10     while (a < 100) {
11         a ++;
12     }
13     NSLog(@"5");//任务5

输入结果如下:

2018-03-20 14:17:56.926465+0800 Test[9084:4536114] 4

2018-03-20 14:17:56.926553+0800 Test[9084:4536223] 1

2018-03-20 14:17:56.926572+0800 Test[9084:4536114] 5

2018-03-20 14:17:57.970056+0800 Test[9084:4536114] 2

2018-03-20 14:17:57.972068+0800 Test[9084:4536223] 3

本例中,首先是一个异步线程,在并行队列globalqueue中执行任务1,执行完毕后有一个同步线程,并跳转到串行队列mainqueue中执行任务2,等任务2执行完毕后才能执行任务3;因为是异步线程,所以执行globalqueue队列中的任务,不会阻塞线程,在主线程中同时会执行任务4,任务4完成后进入循环,之后执行任务5。

 

2.面试题二

3.面试题三

4.面试题四

iOS11的新特性 

点击应用图标到启动应用整个过程,系统进行了什么操作

NSNotification实现逻辑

 

 

5.RunLoop:

事件处理的循环;主线程默认开启runloop,已接收和处理各种事件;

NSRunLoopCommonModes包含NSDefaultRunLoopMode和NSEventTrackingRunLoopMode两种模式,scrollview滚动时会将runloop模式切换为eventtracking模式,如果创建的timer为defaultmode,则两个事件runloop模式不一样,就会收到影响。所以在scrollview中加入timer时,需要将timer的mode设置为commmodes。

stackoverflow的关于runloop mode的问答

 

6.Runtime:

objc_msgSend(receiver, selector);

id是一个结构体类型指针,通过该结构体的isa指针可以找到其对应的Class;Class也是一个结构体指针类型,isa指针指向其所属的元类,类方法被存储在元类中,ivars指向该类的成员变量列表,methodLists指向该类的实例方法列表;

objc_setAssociatedObject(self, associatedKey, click, OBJC_ASSOCIATION_COPY_NONATOMIC); objc_getAssociatedObject(self, associatedKey);

字典转模型的时候:1.根据字典的 key 生成 setter 方法 2.使用 objc_msgSend 调用 setter 方法为 Model 的属性赋值(或者 KVC)

模型转字典的时候:1.调用 class_copyPropertyList 方法获取当前 Model 的所有属性 2.调用 property_getName 获取属性名称 3.根据属性名称生成 getter 方法 4.使用 objc_msgSend 调用 getter 方法获取属性值(或者 KVC)

 

7.面试题五 

atomic一定是线程安全的吗? 不是,只能保证该属性调用setter/getter方法时是安全的,如果别的线程对该属性进行读写之外的其他操作,就会有问题。

load和initialize方法? load在程序启动时调用,main函数之前调用;initialize在使用相关类时才会调用;

 

8.面试题六

kvo和kvc的实现原理

iOS事件传递和响应机制

nextResponder默认为父视图或控制器,如果到达响应链顶端则返回nil

autoreleasepool原理及使用

iOS消息转发机制

MVC和MVVM的区别

 

 

 

posted @ 2018-03-20 16:03  yuyuyu37  阅读(102)  评论(0)    收藏  举报