iOS面试题(五)

iOS面试题(五)

大家好,又见面了,我是你们的朋友全栈君。

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连接的区别

简单说,你浏览的网页(网址以http://开头)都是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那样作为参数

答案都是收集而来,如果有什么错误,欢迎指正!

转载于:https://www.cnblogs.com/WinJayQ/p/9108766.html

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/107494.html原文链接:https://javaforall.net

(0)
上一篇 2022年4月2日 下午10:00
下一篇 2022年4月2日 下午10:35


相关推荐

  • SM4算法设计原理

    SM4算法设计原理SM4分组密码算法描述:SM4分组密码算法是一个迭代分组密码算法,由加解密算法和密钥扩展算法组成。SM4分组密码算法采用非平衡Feistel结构,分组长度为128b密钥长度为128b。加密算法与密钥扩展算法均采用非线性迭代结构。加密运算和解密运算的算法结构相同,解密运算的轮密钥的使用顺序与加密运算相反。密钥及密钥参量:SM4分组密码算法的加密密钥长度为128b,表示为MK=(MK0,M…

    2025年6月10日
    4
  • php依赖注入框架pimple中文文档

    php依赖注入框架pimple中文文档今天 2017 07 16 本文是对 pimple 框架的翻译 真是轻松愉快 因为文档十分简短而且简单 另外 这是一个非常好用的框架 建议同学们尽量使用 学习 pimple 的两大好处 1 很多 php 框架都已经用到了 pimple 本身就需要学习使用方法 2 项目中如本来没有 pimple 可以主动使用 pimple 则做项目的单元测试时就可以轻松替换外部环境 正文如下官方文档

    2026年3月16日
    2
  • 如何学习PLC编程「建议收藏」

    如何学习PLC编程「建议收藏」plc是工业常用的自动化产品可编程控制器,它就相当于人类的大脑控制其他的器官,可编程控制器说白了就是个CPU,带几个模块,模块功能主要是,模拟量输入输出,数字量输入输出,其他功能计数模块。PLC在工业领域里扮演着重要的角色,作为一家企业或者个人应如何学习PLC呢?1.有一定的电工基础,掌握传感器、接近开关、编马器、气动元件等常用器件的使用及继电器控制原理。2.再学数制及数制转换,掌握二进制、八进制、十六进制、BCD码、ASCI码的概念。3.选择你所在地区流型的PLC品牌做为学习的机种,学会后可以更

    2022年10月19日
    5
  • 原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)

    原生HTML+CSS+JS制作自己的导航主页(前端大作业,源码+步骤详解)文章目录前言插入背景一、头部1.导航栏2.优化导航栏3时间前言插入背景首先设置我们的背景。在body中插入背景即可。index.html<!doctypehtml><htmllang=”en”><head><metacharset=”UTF-8″><metaname=”Designer”content=”LiWei”><metaname=”Description”cont

    2022年7月22日
    20
  • IDEA 控制台乱码 解决方法[通俗易懂]

    IDEA 控制台乱码 解决方法[通俗易懂]IDEA如果不进行配置的话,运行程序时控制台就会中文乱码,严重影响我们对信息的观察和程序的跟踪.非常的痛苦,那么上解决方法

    2025年5月26日
    7
  • Kubernetes 安装flannel组件(本地 kube-flannel.yml 文件)

    Kubernetes 安装flannel组件(本地 kube-flannel.yml 文件)可以直接用 kubectlapply fhttps raw githubuserco com coreos flannel master Documentatio kube flannel yml 搞定 但是 raw githubuserco com 已经被墙了 如果可以科学上网 上面可以直接搞定 如果不能科学上网 这里放上 kube flannel yml 文件的源码生产文件后 在文件所有目录执行 kubectlapply fkube flannel ymlkub

    2026年3月18日
    3

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号