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.面试题四
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.面试题六
nextResponder默认为父视图或控制器,如果到达响应链顶端则返回nil

浙公网安备 33010602011771号