2019iOS面试题总结

1.苹果推送的原理

1.1由App向iOS设备发送一个注册通知,用户需要同意系统发送推送。

1.2iOS向APNs远程推送服务器发送App的Bundle Id和设备的UDID。

1.3APNs根据设备的UDID和App的Bundle Id生成deviceToken再发回给App。

1.4App再将deviceToken发送给远程推送服务器(自己的服务器), 由服务器保存在数据库中。

1.5当自己的服务器想发送推送时, 在远程推送服务器中输入要发送的消息并选择发给哪些用户的deviceToken,由远程推送服务器发送给APNs。

1.6APNs根据deviceToken发送给对应的用户。

原文地址:https://www.jianshu.com/p/75161fc153cd

2.CALayer和UIView的区别

2.1每个 UIView 内部都有一个 CALayer 在背后提供内容的绘制和显示,并且 UIView 的尺寸样式都由内部的 Layer 所提供。两者都有树状层级结构,layer 内部有 SubLayers,View 内部有 SubViews.但是 Layer 比 View 多了个AnchorPoint

2.2在 View显示的时候,UIView 做为 Layer 的 CALayerDelegate,View 的显示内容由内部的 CALayer 的 display

2.3CALayer 是默认修改属性支持隐式动画的,在给 UIView 的 Layer 做动画的时候,View 作为 Layer 的代理,Layer  通过 actionForLayer:forKey:向 View请求相应的 action(动画行为)

2.4layer 内部维护着三分 layer tree,分别是 presentLayer Tree(动画树),modeLayer Tree(模型树), Render Tree (渲染树),在做 iOS动画的时候,我们修改动画的属性,在动画的其实是 Layer 的 presentLayer的属性值,而最终展示在界面上的其实是提供 View的modelLayer

2.5两者最明显的区别是 View可以接受并处理事件,而 Layer 不可以

原文地址:https://www.jianshu.com/p/079e5cf0f014

3.UI视图之间的事件传递和响应

3.1我们点击屏幕产生触摸事件,系统将这个事件加入到一个由UIApplication管理的事件队列中,UIApplication会从消息队列里取事件分发下去,首先传给UIWindow

3.2在UIWindow中就会调用hitTest:withEvent:方法去返回一个最终响应的视图

3.3在hitTest:withEvent:方法中就回去调用pointInside: withEvent:去判断当前点击的point是否在UIWindow范围内,如果是的话,就会去遍历它的子视图来查找最终响应的子视图

3.4遍历的方式是使用倒序的方式来遍历子视图,也就是说最后添加的子视图会最先遍历,在每一个视图中都回去调用它的hitTest:withEvent:方法,可以理解为是一个递归调用

3.5最终会返回一个响应视图,如果返回视图有值,那么这个视图就作为最终响应视图,结束整个事件传递;如果没有值,那么就会将UIWindow作为响应者

原文地址:https://www.jianshu.com/p/2c16077b50f8

4.tableView的优化

4.1懒加载创建tebleview

4.2复用cell,设置唯一标识符

4.3图片圆角:a.直接让美工把图片切成圆角进行显示,这是效率最高的一种方案;b.很多情况下用户上传图片进行显示,可以让服务端处理圆角;c.使用代码手动生成圆角Image设置到要显示的View上,利用UIBezierPath(CoreGraphics框架)画出来圆角图片

4.4避免快速滑动,开启过多线程

4.5异步加载图片[imageView sd_setImageWithURL:url completed:^(UIImage*image,NSError*error, SDImageCacheType cacheType,NSURL*imageURL) {imageView.image = image;}];

4.6优化cell高度,将高度提前计算好存入Model中

4.7尽量避免图片透明,使用不透明视图, 如非必要, 可以设置opaque为yes,用以减少复杂图层合成

4.8cellForRowAtIndexPath不要做耗时操作,读取文件/写入文件,尽量不要去添加和移除view;

4.9尽量设置layer的大小值为整形值

4.10使用ShadowPath指定layer阴影效果路径;当我们需要圆角效果时,可以使用一张中间透明图片蒙上去

5.iOS中如何使用socket

建立Socket连接至少需要一对套接字,分别运行于服务端(ServerSocket)和客户端(ClientSocket)。套接字直接的连接过程氛围三个步骤:5.1服务器监听:服务端Socket始终处于等待连接状态,实时监听是否有客户端请求连接。5.2客户端请求:客户端Socket提出连接请求,指定服务端Socket的地址和端口号,这时就可以向对应的服务端提出Socket连接请求。5.3连接确认:当服务端Socket监听到客户端Socket提出的连接请求时作出响应,建立一个新的进程,把服务端Socket的描述发送给客户端,该描述得到客户端确认后就可建立起Socket连接。而服务端Socket则继续处于监听状态,继续接收其他客户端Socket的请求。

原文地址:https://www.jianshu.com/p/8e599ca5dfe8参考文章:https://www.jianshu.com/p/cf30e90c8269

6.AFNetWorking的实现原理

在ios开发中,一般情况下,简单的向某个web站点简单的页面提交请求并获取服务器的响应,用xcode自带的NSURLConnection是能胜任的。但是,在绝大部分下我们所需要访问的web页面则是属于那种受到权限保护的页面,并不是有一个简单的URL可以访问的。这就涉及到了Session和Cookie的处理了,在此时使用NSURLConnection也是能够达到要求的,只是其中处理起来的复杂度和难度就提升了。  为了更好的处理向Web站点的请求,包括处理Session,Cookie等细节问题,使用AFNetworking则是更好的选择,他可以用于发送HTTP请求,接收HTTP的响应,但是不会缓存服务器的响应,不能执行HTML页面中的JAvascript代码,同时,AFNetworking还内置支持JSON,plist文件和XML文件的解析,使用比较方便。 扩展:1、Session:中文有译作时域的,就是只某个客户端在访问服务器起到停止访问这一段的时间间隔被称为时域。 2、Cookie:由服务器发送给客服端,把Cookie的key:value值储存在本地文件夹下,当下次请求的时候能够直接发送Cookie获得权限验证

原文地址:https://blog.csdn.net/lcg910978041/article/details/51485062

7.runtime的原理和作用

7.1原理:a.runtime是一套比较底层的纯C语言API, 属于1个C语言库, 包含了很多底层的C语言API。在我们平时编写的OC代码中, 程序运行过程时, 其实最终都是转成了runtime的C语言代码, runtime算是OC的幕后工作者。b.RunTime简称运行时,就是系统在运行的时候的一些机制,其中最主要的是消息机制。c.对于C语言,函数的调用在编译的时候会决定调用哪个函数,编译完成之后直接顺序执行,无任何二义性。d.OC的函数调用成为消息发送。属于动态调用过程。在编译的时候并不能决定真正调用哪个函数(事实证明,在编 译阶段,OC可以调用任何函数,即使这个函数并未实现,只要申明过就不会报错。而C语言在编译阶段就会报错)。e.只有在真正运行的时候才会根据函数的名称找到对应的函数来调用。

7.2作用:a. 动态的添加对象的成员变量和方法,修改属性值和方法b. 动态交换两个方法的实现c. 实现分类也可以添加属性d. 实现NSCoding的自动归档和解档e. 实现字典转模型的自动转换f. 动态创建一个类(比如KVO的底层实现)

原文地址:https://www.jianshu.com/p/462b88edbe5c

8.MVC,MVP,MVVM设计模式区别及优缺点

MVC优点:a.耦合性低,视图层和业务层分离,这样就允许更改视图层代码而不用重新编译模型和控制器代码。b.重用性高c.生命周期成本低d.MVC使开发和维护用户接口的技术含量降低e.可维护性高,分离视图层和业务逻辑层也使得WEB应用更易于维护和修改f.部署快

MVC缺点:a.不适合小型,中等规模的应用程序,花费大量时间将MVC应用到规模并不是很大的应用程序通常会得不偿失。b.视图与控制器间过于紧密连接,视图与控制器是相互分离,但却是联系紧密的部件,视图没有控制器的存在,其应用是很有限的,反之亦然,这样就妨碍了他们的独立重用。c.视图对模型数据的低效率访问,依据模型操作接口的不同,视图可能需要多次调用才能获得足够的显示数据。对未变化数据的不必要的频繁访问,也将损害操作性能。


MVP特点:a.M、V、P之间双向通信。b.View 与 Model 不通信,都通过 Presenter 传递。Presenter完全把Model和View进行了分离,主要的程序逻辑在Presenter里实现。c.View 非常薄,不部署任何业务逻辑,称为”被动视图”(Passive View),即没有任何主动性,而 Presenter非常厚,所有逻辑都部署在那里。d.Presenter与具体的View是没有直接关联的,而是通过定义好的接口进行交互,从而使得在变更View时候可以保持Presenter的不变,这样就可以重用。不仅如此,还可以编写测试用的View,模拟用户的各种操作,从而实现对Presenter的测试–从而不需要使用自动化的测试工具。

MVP优点:a.模型与视图完全分离,我们可以修改视图而不影响模型;b.可以更高效地使用模型,因为所有的交互都发生在一个地方——Presenter内部;c.我们可以将一个Presenter用于多个视图,而不需要改变Presenter的逻辑。这个特性非常的有用,因为视图的变化总是比模型的变化频繁;d.如果我们把逻辑放在Presenter中,那么我们就可以脱离用户接口来测试这些逻辑(单元测试)。

MVP缺点:视图和Presenter的交互会过于频繁,使得他们的联系过于紧密。也就是说,一旦视图变更了,presenter也要变更。


MVVM模式和MVC模式类似,主要目的是分离视图(View)和模型(Model),有几大优点:a.低耦合,视图(View)可以独立于Model变化和修改,一个ViewModel可以绑定到不同的”View”上,当View变化的时候Model可以不变,当Model变化的时候View也可以不变。b.可重用性,可以把一些视图逻辑放在一个ViewModel里面,让很多view重用这段视图逻辑。c.独立开发,开发人员可以专注于业务逻辑和数据的开发(ViewModel),设计人员可以专注于页面设计,使用Expression Blend可以很容易设计界面并生成xml代码。d.可测试,界面向来是比较难于测试的,而现在测试可以针对ViewModel来写。

原文地址:https://blog.csdn.net/weixin_34294649/article/details/86753644

你可能感兴趣的:(2019iOS面试题总结)