iOS

作者: juriau | 来源:发表于2020-04-01 11:24 被阅读0次
    1.应用程序的启动过程?

    1.执行main函数,main函数中运行UIApplicationMain函数,创建UIApplication对象和其代理。

    2.程序启动完毕时,通知代理Appdelegate, 调用 didFinishLaunching 代理方法,在这里会创建 UIWindow,设置它的rootViewController。

    3.最后调用[self.window makeKeyAndVisable]显示窗口。

    一、Runloop && 事件

    1.Runloop的作用是什么?Runloop的内部构造?

    Runloop的作用:
    1.保证程序不退出;(保证线程不退出,主线程默认开启线程,子线程默认不开启
    2.负责处理输入事件;(特定模式下
    3.没有输入消息时休眠。

    Runloop就是一个do while死循环。

    2.为什么微信TableView滑动的时候动图是不动的?/ Runloop的mode作用是什么?

    因为scrollView在滑动的时候,Runloop的模式由默认模式转变为界面追踪模式,保证界面流畅不受其他Mode的影响。我们可以将动图的NSTimer在Runloop中的模式改变一下,有一个模式标记了默认模式和界面追踪模式两种模式。

    3. autoreleasePool 在何时被释放?

    当RunLoop开启时,就会自动创建一个自动释放池,当RunLoop在即将进入休眠时会释放掉自动释放池的东西,然后重新创建一个新的空的自动释放池,

    2.用户点击屏幕,系统是怎么找到一个view并决定由它来响应事件的? / 谈谈你对事件的传递链和响应链的理解?

    当发生触摸事件,主线程的runloop被唤醒,将收到的触摸事件封装成UIEvent,加入UIApplication的事件队列中,UIApplication将最早的事件分发给根部的UIWindow去处理,UIWindows则调用hitTest方法向子视图(向下)迭代检测。

    找到第一响应者之后,如果它不处理该事件,事件传递给它的视图控制器。如果此视图控制器也不处理,则传递给第一响应者的父视图、父视图的控制器,通过视图层次结构依次传递;如果没有任何视图或控制器处理它,那么将事件传递给应用的窗口,然后是UIApplication,还不处理就丢弃。

    我们可以看到事件的传递链是从UIWindow沿着视图层级由上往下,响应链是从第一响应者沿着视图层级由下往上。

    3.如何扩大view的响应范围

    重写hitTest或pointInside方法。

    4.如何通过一个view查找它所在的viewController?

    因为view的下一个响应者是它的viewController,所以我们可以通过获得它的nextResponder,判断是不是UIViewController,如果是的话,就是它的viewController。

    二、绘图与动画

    1.UIView 和 CALayer 的区别?请说一下对 CALayer 的认识。

    1.分工不同。UIView侧重于对显示内容的管理和布局;CALayer侧重于对显示内容的绘制、显示和动画效果。
    2.UIView继承自UIResponder可以响应用户事件;CALayer继承自NSObject不能响应用户事件。
    2.所属框架不同。UIView属于UIKit框架;CALayer是属于Core Animation框架。

    2.什么是隐式动画?什么是显式动画?

    隐式动画:直接设定UI元素的一些可见属性的目标值,即可自动生成属性变换的过渡动画。如:+ animateWithDuration:animations:completion:

    显式动画:需要显式地定义完整的动画流程,更灵活,可以实现更复杂的动画效果。

    3.frame和bounds有什么区别?

    frame是在父视图坐标系中view的位置和大小;bounds是在自身坐标系中view的位置和大小。

    三、对象间通讯

    1.Block和Delegate的比较?

    Block和Delegate的都是一个对象的行为需要另一个对象协助完成。

    Block可以说是轻量型的delegate,不需要像Delegate那样需要定义协议,代理对象实现协议方法,建立对象间的代理关系才可以通讯。

    2.Block和通知的区别,分别适用什么场景?

    Block和Delegate的都是一个对象的行为需要另一个对象协助完成。
    通知是监听对象的状态变化。

    比如block用于下载完成的处理;通知用于监听应用下方textField的弹起操作。

    3.谈谈 KVC 以及 KVO 的理解? / KVO的实现原理

    1.KVC是键值编码;KVO是键值观察。
    2.KVC用于设置和获取键的值;KVO用于监听属性的值发生变化,前提是需要遵循KVC来设置属性值,观察者对象才会获取通知。

    在某个类的对象被观察的时候,runtime动态生成该类的一个子类,并且让实例对象的isa指向这个全新的子类,在这个子类中重写父类setter方法,在原setter方法的前后添加willChangValueForKey:didChangeValueForKey:,这样当修改属性的时候内部会触发observeValueForKeyPath

    4.KVO和NSNotification的区别?

    1.KVO监听数据变化;NSNotification不局限于数据,还可以对多种状态的变化进行监听。
    2.KVO直接通知观察者;NSNotification会像观察者发送一个notification对象,来通知观察者。

    5.怎么理解Block的?

    我理解的block是delegate的轻量级,用于对象间通讯,一个对象需要另一个对象协助完成任务 / 将这个对象的数据传递给另一个对象。

    6.Block的变量截获机制?

    如果是捕获自动变量,会在block结构体中增加一个同名同类型变量;如果是静态变量,会在结构体中增加一个指向静态变量的指针。

    7.__block的实现原理?

    使用__block,会把__block修饰的变量封装进一个结构体中。block中增加一个指向变量结构体的指针。

    8.三种Block

    存储在栈中的block:引用了外部变量,但用weak修饰;
    存储在堆中的block:引用了外部变量,strong或copy修饰的成员变量;
    存储在全局区的block:没有引用外部变量或只用到了全局变量。

    9.Block的循环引用、如何解决、原理

    如果block和对象相互持有时,会出现循环引用。比如说block是对象的属性,而在block中 又调用了对象的属性或方法。

    解决方法:声明一个weak类型的对象指向原对象,在block中使用weak类型的对象。

    知道哪些设计模式?

    比如说MVC、单例模式;基于协议实现的代理模式,基于通知实现的观察者模式;

    相关文章

      网友评论

          本文标题:iOS

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