欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

iOS面试题 - tableView的重用机制?

程序员文章站 2022-04-12 20:15:10
1、tableview的重用机制? uitableview 通过重用单元格来达到节省内存的目的: 通过为每个单元格指定一个重用标识符,即指定了单元格的种类,当屏幕上的单元格滑出屏幕时,会把这个单元...

1、tableview的重用机制?

uitableview 通过重用单元格来达到节省内存的目的: 通过为每个单元格指定一个重用标识符,即指定了单元格的种类,当屏幕上的单元格滑出屏幕时,会把这个单元格添加到重用队列中,等待被重用,当有新单元格从屏幕外滑入屏幕内时,从重用队列中找看有没有可以重用的单元格,如果有,就拿过来用,如果没有就创建一个来使用。

2、在手势对象基础类uigesturerecognizer的常用子类手势类型中哪两个手势发生后,响应只会执行一次?

uitapgesturerecognizer,uiswipegesturerecognizer是一次性手势,手势发生后,响应只会执行一次。

3、描述下sdwebimage里面给uiimageview加载图片的逻辑

sdwebimage 中为 uiimageview 提供了一个分类uiimageview+webcache.h, 这个分类中有一个最常用的接口sd_setimagewithurl:placeholderimage:,会在真实图片出现前会先显示占位图片,当真实图片被加载出来后再替换占位图片。

加载图片的过程大致如下:
1.首先会在 sdwebimagecache 中寻找图片是否有对应的缓存, 它会以url 作为数据的索引先在内存中寻找是否有对应的缓存
2.如果缓存未找到就会利用通过md5处理过的key来继续在磁盘中查询对应的数据, 如果找到了, 就会把磁盘中的数据加载到内存中,并将图片显示出来
3.如果在内存和磁盘缓存中都没有找到,就会向远程服务器发送请求,开始下载图片
4.下载后的图片会加入缓存中,并写入磁盘中
5.整个获取图片的过程都是在子线程中执行,获取到图片后回到主线程将图片显示出来

sdwebimage原理:
调用类别的方法:
1. 从内存(字典)中找图片(当这个图片在本次使用程序的过程中已经被加载过),找到直接使用。
2. 从沙盒中找(当这个图片在之前使用程序的过程中被加载过),找到使用,缓存到内存中。
3. 从网络上获取,使用,缓存到内存,缓存到沙盒。

4、afnetworking 底层原理分析

afnetworking主要是对nsurlsession和nsurlconnection(ios9.0废弃)的封装,其中主要有以下类:
1). afhttprequestoperationmanager:内部封装的是 nsurlconnection, 负责发送网络请求, 使用最多的一个类。(3.0废弃)
2). afhttpsessionmanager:内部封装是 nsurlsession, 负责发送网络请求,使用最多的一个类。
3). afnetworkreachabilitymanager:实时监测网络状态的工具类。当前的网络环境发生改变之后,这个工具类就可以检测到。
4). afsecuritypolicy:的工具类, 主要是针对 https 服务。
5). afurlrequestserialization:序列化工具类,基类。上传的数据转换成json格式
(afjsonrequestserializer).使用不多。
6). afurlresponseserialization:反序列化工具类;基类.使用比较多:
7). afjsonresponseserializer; json解析器,默认的解析器.
8). afhttpresponseserializer; 万能解析器; json和xml之外的数据类型,直接返回二进
制数据.对服务器返回的数据不做任何处理.
9). afxmlparserresponseserializer; xml解析器;

5、谈谈 uitableview 的优化

1). 正确的复用cell。
2). 设计统一规格的cell
3). 提前计算并缓存好高度(布局),因为heightforrowatindexpath:是调用最频繁的方法;
4). 异步绘制,遇到复杂界面,遇到性能瓶颈时,可能就是突破口;
4). 滑动时按需加载,这个在大量图片展示,网络加载的时候很管用!
5). 减少子视图的层级关系
6). 尽量使所有的视图不透明化以及做切圆操作。
7). 不要动态的add 或者 remove 子控件。最好在初始化时就添加完,然后通过hidden来控制是否显示。
8). 使用调试工具分析问题。

6、如何实行cell的动态的行高

如果希望每条数据显示自身的行高,必须设置两个属性,1.预估行高,2.自定义行高。
设置预估行高 tableview.estimatedrowheight = 200。
设置定义行高 tableview.estimatedrowheight = uitableviewautomaticdimension。
如果要让自定义行高有效,必须让容器视图有一个自下而上的约束。

7、socket连接和http连接的区别

简单说,你浏览的网页(网址以https://开头)都是http协议传输到你的浏览器的, 而http是基于socket之上的。socket是一套完整tcp,udp协议的接口。

http协议:简单对象访问协议,对应于应用层  ,http协议是基于tcp连接的

tcp协议: 对应于传输层

ip协议: 对应于网络层

tcp/ip是传输层协议,主要解决数据如何在网络中传输;而http是应用层协议,主要解决如何包装数据。

socket是对tcp/ip协议的封装,socket本身并不是协议,而是一个调用接口(api),通过socket,我们才能使用tcp/ip协议。

http连接:http连接就是所谓的短连接,即客户端向服务器端发送一次请求,服务器端响应后连接即会断掉;

socket连接:socket连接就是所谓的长连接,理论上客户端和服务器端一旦建立起连接将不会主动断掉;但是由于各种环境因素可能会是连接断开,比如说:服务器端或客户端主机down了,网络故障,或者两者之间长时间没有数据传输,网络防火墙可能会断开该连接以释放网络资源。所以当一个socket连接中没有数据的传输,那么为了维持连接需要发送心跳消息~~具体心跳消息格式是开发者自己定义的

1)socket是一个针对tcp和udp编程的接口,你可以借助它建立tcp连接等等。而tcp和udp协议属于传输层 。

而http是个应用层的协议,它实际上也建立在tcp协议之上。

(http是轿车,提供了封装或者显示数据的具体形式;socket是发动机,提供了网络通信的能力。)

2)socket是对tcp/ip协议的封装,socket本身并不是协议,而是一个调用接口(api),通过socket,我们才能使用tcp/ip协议。socket的出现只是使得程序员更方便地使用tcp/ip协议栈而已,是对tcp/ip协议的抽象,从而形成了我们知道的一些最基本的函数接口。

8、利用socket建立网络连接的步骤

建立socket连接至少需要一对套接字,其中一个运行于客户端,称为clientsocket ,另一个运行于服务器端,称为serversocket 。

套接字之间的连接过程分为三个步骤:服务器监听,客户端请求,连接确认。

1。服务器监听:服务器端套接字并不定位具体的客户端套接字,而是处于等待连接的状态,实时监控网络状态,等待客户端的连接请求。

2。客户端请求:指客户端的套接字提出连接请求,要连接的目标是服务器端的套接字。为此,客户端的套接字必须首先描述它要连接的服务器的套接字,指出服务器端套接字的地址和端口号,然后就向服务器端套接字提出连接请求。

3。连接确认:当服务器端套接字监听到或者说接收到客户端套接字的连接请求时,就响应客户端套接字的请求,建立一个新的线程,把服务器端套接字的描述发给客户端,一旦客户端确认了此描述,双方就正式建立连接。而服务器端套接字继续处于监听状态,继续接收其他客户端套接字的连接请求。

9、我们说的oc是动态运行时语言是什么意思?

多态。 主要是将数据类型的确定由编译时,推迟到了运行时。
简单来说,运行时机制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。

10、id和instancetype

id可以指向任何类型的指针 或 指向任何未知类型的指针。
instancetype只能作为返回值,不能像id那样作为参数。