iOS开发八股整理本文整理了一些常见的iOS面试八股,有UI层面的,有底层方面的,也有设计相关的。希望能够帮助到

UITouch表示了触摸在屏幕上的位置、移动、大小、压力。

UIResponder抽象了响应和处理事件的接口。

当iPhone接受到一个触摸事件时,处理过程如下:

UIWindow开始使用逆序深度优先遍历算法,查找到最合适的Responsder。响应过程是顺着事件传递过程的路径反向进行的。view的nextResponder可能是控制器,也可能是view。

离屏渲染是指GPU在当前屏幕缓冲区(FrameBuffer)以外开辟一块新的缓冲区(Off-ScreenBuffer)进行渲染工作。在当前屏幕缓冲区之外的渲染称之为离屏渲染。创建新的缓冲区是会消耗CPU和GPU资源的,而且创建和删除缓冲区都需要CPU和GPU同步,这会造成GPU渲染流水线停顿。离屏渲染需要两次渲染工作,一次在当前屏幕缓冲区另一次在离屏缓冲区,这意味着GPU需要做更多的工作。触发离屏渲染时会从FrameBuffer切换到Off-ScreenBuffer,渲染完毕后再切换回FrameBuffer,这一过程需要来回切换上下文,因此对性能有一定的影响。

以下方式会造成离屏渲染:

实际上可以理解为该视图需要多个图层合并的情况下。

离屏渲染并不一定是不好的,合理使用离屏渲染也是提高app性能的一种方式。比如在视图包含图片切比较复杂的情况下,开启光栅化虽然会造成离屏渲染,但是系统会将这一次渲染结果进行保存,下次需要渲染的时候之间就可以拿过来使用了,从而在一定程度上提高了性能。需要注意的是,该缓存只有100ms,且大小不得超过屏幕像素数据的2.5倍。

UITableView常用的优化思路如下:

可以从进入UIViewController和退出两个方面阐述。

当进入一个视图控制器时:

当退出一个视图时:

实例对象的底层实际上是一个结构体,比如一个NSObject的实例对象结构如下:

structNSObject_IMP{Classisa;};2.2类对象的本质类对象的本质也是一个结构体。结构体里面保存了isa、superclass指针、方法缓存、类信息等。实例对象的isa指向类对象。类对象的isa指向元类对象。类对象和元类对象的结构是一样的。isa从64位以后是以共用体形式存在的。下面是简化版的结构:

structcategory_t{constchar*name;classref_tcls;structmethod_list_t*instanceMethods;structmethod_list_t*classMethods;structprotocol_list_t*protocols;structproperty_list_t*instanceProperties;structproperty_list_t*classProperties;method_list_t*methodsForMeta(boolisMeta){if(isMeta)returnclassMethods;elsereturninstanceMethods;}property_list_t*propertiesForMeta(boolisMeta,structheader_info*hi);}后编译的分类方法会被插入到类的方法列表前面,因此会先调用分类方法。

load方法调用顺序:

initialize的方法调用顺序:

两者的区别是load方法的调用是直接通过函数地址调用,而initialize方法是消息发送。initialize方法如果子类没有实现,那么父类的方法会被调用多次。

KVO是OC里面的对类的属性变化监听的技术。其原理用到了OC的runtime底层技术,体现了OC动态语言的强大之处。具体实现是这样的:当我们给一个实例对象XXX添加观察者调用addObserver:forKeyPath:方法后,该方法内部会进行一系列的处理。其内部会生成一个XXX的子类NSKVONotifing_XXX,并且XXX的isa会指向新生成的子类,因此在调用方看来还是跟之前一样。这个新派生的类重写了基类NSObject的class、_isKVOA、dealloc和父类被观察属性的setter方法。

被观察属性的setter方法被重写后,里面会调用_NSSetXValueAndNotifiy(),其内部会调用[supersetXX:xx]且之前之后分别插入[selfwillChangeValueForKey]和[selfdidChangeValueForKey]。后者会调用观察者实现的observerValueForKeyPath:ofObject:change:context:方法;使用KVO的时候应该注意,在合适的时机移除观察者,否则会触发NSRangeException异常;KVC会触发KVO,但是直接给成员变量赋值是不会触发的;

KVC,说的官方一点就是“键值编码”,通过KVC这种技术可以给一个类的私有属性进行赋值,比如UITextField的placholderLabel修改文字颜色等等。使用方法是setValue:forKey:或者是setValue:ForKeyPath:。其中value可以传nil。可以提一下的是,字典的方法setObject:forKey:中的两个参数都不可以为空。

下面谈谈KVC的实现原理。先去看有没有实现上面提到的两个赋值方法,如果有就直接赋值,如果没有就调用accessInstanceVariablesDirectly方法,如果返回了NO,就调用valueForUndefineKey:方法,并抛出异常。如果是返回了YES,说明可以直接访问成员变量,按照_key,_isKey,key,isKey的顺序找成员变量,如果找到了就赋值,反之就调用valueForUndefineKey:并抛出异常。

KVC的取值跟上面的类似,查找顺序是getKey,key,isKey,_Key,如果找到了就返回,没有找到也是调用accessInstanceVariableDirectly方法判断是否能够直接访问成员变量,如果可以的话,就按照_key,_isKey,key,isKey这个顺序查找。

通知中心维护了一个table,table里面包含了named表、nameless表、wildcard链表这三个数据结构;当我们调用addObserver:selector:name:object:方法时,其内部大概是这样实现的:1.构造一个Observation对象,该对象里面保存着object和selector,可以看做是一个链表的节点。2.判断传入的name是否为空。如果name不为空,以name为key从named的字典中取出一个n字典,然后从n字典里面以object为key取出observation,再然后把observation对象存入链表。3.判断传入的object是否为空。如果object不为空,以object为key从namedless字典中取出observation链表,将observation对象存入;4.如果name和object都为空,则将Observertion对象存入wildcard链表中。

发送通知的过程是先判断object,再判断name。name的优先级高于object。

同步的,会调用performSelector:withObject。但是有种情况可以不实时发送通知,而是在合适的时机发送,并没有开启线程,这种说法是指使用NSOperationQueue,指定发送时机,可以依赖Runloop等到下一次循环开始时发送。

是的,发送消息在哪个线程,接收消息就在哪个线程。

没有异步发送一说,只是利用了Runloop可以选择触发时机。

前者依赖后者。比如指定postStyle的时候NSPostWhenIdle表示在Runloop空闲的时候发送。此外还有NSPostASAP,尽可能快发送,NSPostNow多个相同的通知合并后马上发送。

使用block方式注册通知,在主队列响应。或者是在主线程注册machPort,这是负责线程通信的,当异步线程收到通知后,给machport发送消息。还可以在通知的回调方法里面,使用GCD主队列调度方法。

iOS9之后不会了,通知中心对Observer是弱引用的。

多次添加会多次响应。移除没事儿。

当给某个实例发送一个消息找不到方法时,就会进入所谓的消息转发流程。消息转发流程是这样的:

虽然是通过super关键字调用方法,本质上还是给当前对象发送消息,只不过是方法查找的起点是从父类开始:objcMsgSendSuper2:这么一个函数调用。该函数接收两个参数,第一个是一个结构体:

structobjc_super2{idreceiver;//消息接收者,也就是selfClasscurrent_class;//方法查找起点,也就是父类}第二个参数是SEL。像下面这种调用方式肯定会死循环的:

@implementation**B-(void)a{[superperformSelector:@selector(a)];}@end3.Block的本质block本质也是一种OC对象,其内部也有isa,是封装了函数调用和函数调用环境的OC对象。有三种类型block,即NSGlobalBlock、NSStackBlock、NSMallocBlock,这三种block都继承自NSBlock。没有访问auto变量的block属于Global类型的,保存在数据区。在ARC环境下,block作为返回值、usingBlock:方法传入的block、block被__strong指针指向、GCD里面的block,这些情况下编译器会自动识别并且会调用copy方法拷贝到堆上。

block的变量捕获:auto类型的变量是值捕获,static修饰的变量是指针捕获,全局变量不捕获。

Runtime是OC的基石,没有Runtime支持就没有OC、也没有OC的动态特性。通过Runtime的api可以实现很多功能,比如方法交换、动态生成类(KVO)、获取类的成员变量方法列表等信息、字典转模型、关联对象等等。常用api:

Runloop是APP运行的保证,事件处理、NStimer、autoreleasePoll内存管理、GCD回到主队列的执行、网络请求、perforSelector、屏幕刷新都是基于Runloop的,Runloop的底层实际上就是一个做了很多事情的while循环,前面说的那些事情就是在循环内部实现的。Runloop和线程是一一对应关系,每个线程都可以获取一个Runloop。

OC里面有可以通过NSRunloop来使用Runloop,也可以使用CFRunloopRef这套C语言的api使用。

Runloop和线程是以一一对应关系,保存在全局字典里面,线程对象作为key,Runloop为值。Runloop会在第一次获取的时候创建。子线程的Runloop默认是不开启的。Runloop会在线程结束后销毁。

CFRunloopRef是个结构体指针,结构体里面有三个集合分别是_commonModes、_commonModeItems、_modes,还有_currentMode和pthread。

每个mode里面包含source0、source1、timers、observers,如果没有这些东西,Runloop会退出。observer可以监听Runloop的六种状态,进入、退出、处理source、处理timer、开始等等、结束等待,枚举值分别为kCFRunloopEntry、kCFRunloopExit、kCFRunloopBeforeSources、kCFRunloopBeforeTimers、kCFRunloopBeforeWating、kCFRunlooopAfterWating。

Runloop的运行逻辑:

自从iOS5开始,OC的内存管理由MRC升级到了ARC,即自动引用计数。ARC是编译器、Runtime共同作用下完成的。OC的内存管理是通过引用计数来实现的,当一个对象的引用计数为0时,该对象就会被释放。引用计数是被存储在isa指针或者是SideTable里面,当isa指针提供的19位不够使用时就会存到SideTable。

SideTable是内存管理的方案之一,包含了引用计数表和弱引用表。__weak修饰的对象,就会被添加到弱引用表里面。一个iOS项目会全局维护一个SideTables,SideTables里面又有多个SideTable(真机情况下是8个)。SideTable里面有线程锁、RefcountMap、weak_table_t三个核心属性。

AutoreleasePool实际用途:

iOS里面常用的线程方案有NSThread、NSOperation、GCD。NSThread是基于p_thread的高层次封装,NSOperation是基于GCD的封装。NSOpeartion不能够直接使用,通常情况下我们会使用NSBlockOperation和NSInvocationOperation,前者的回调是block形式的,后者是方法。我们还可以使用NSOperationQueue控制并发数、添加依赖、取消任务等等多种操作。GCD是面向C语言的接口,通过block的形式执行任务,使用起来代码更加聚合。

使用GCD的时候需要注意死锁。使用sync函数向当前串行队列中添加任务时就会产生死锁。

TCP建立连接需要经过所谓的“三次握手”。

之所以是三次握手而不是两次,是因为双方都需要确定对方有发送消息和接收消息的能力,如果只有两次的话服务端是不知道客户端是否有接收消息的能力的。

THE END
1.SOLIDWORKS2025新增设计功能在工程设计领域,SOLIDWORKS一直以其强大的功能和易用性受到广泛赞誉。随着SOLIDWORKS 2025的发布,这款三维CAD设计软件再次展现了其在设计功能上的创新与突破。本文将详细介绍SOLIDWORKS 2025新增的设计功能,展示其如何助力设计师实现更有效、更准确的设计工作,并带领创新设计的未来。 https://www.elecfans.com/d/6393277.html
2.Solidcenter三维设计软件亚龙Solid Center三维工业设计软件是亚龙自主品牌的一款面向工业和教育的虚实一体化集成的三维设计软件。基于Windows平台,既有传统三维软件的建模等功能,同时也突出在自动化集成领域三维设计功能,软件具有特征建模和协同建模两大建模方式,同时兼容市面上常见的三维软件格式,支持自顶向下和由底往上的设计思想,其零件建模、钣https://cdisi.cn/?id=5
3.solidcenter(三维)工业设计软件使用教程solidcenter(三维)工业设计软件使用教程 solidcenter(三维)工业设计软件使用教程 2996人在学 免费 立即报名 课程介绍课程目录 答疑 我崔佳坦就是爱学 0 stth 怎么是截屏讲的,看不懂呀 0 未来可期 软件和模型素材在哪下载 0 更多http://www.haoqixing.com/course/detail/83.html
4.调试赛项新增软件:SolidCenter软件单一来源采购公示一、采购人名称:江苏信息职业技术学院二、采购项目名称:现代电气控制系统安装与调试赛项新增软件:Solid Center软件 1个点三、采购预算:1.5万元四、项目概况:根据2022年江苏省职业院校技能大赛现代电气控制系统安装与调试赛项竞赛规程,增加了数字化工业场景搭建的考核点https://www.jsit.edu.cn/info/1069/22017.htm
5.TeamcenterCacheTeamcenter缓存管理器 该应用程序允许Solid Edge / Teamcenter用户在现有工作空间(缓存位置)之间切换或创建新的工作空间,而无需将当前工作空间数据加载到内存中。 可以将应用程序添加到Solid Edge快速访问工具栏。 Teamcenter工程数据管理 浏览:9 使用teamcenter对工程数据进行有效管理。会使用版本规则、变量和有效性配置结构https://download.csdn.net/download/weixin_42134051/16448444
6.亚龙SolidCenter三维设计软件《职业》2020年05期[软件介绍]亚龙Solid Center三维设计软件是亚龙智能自主投入研发的一款面向工业三维设计软件。它是集创新设计、工程设计、协同设计于一体的CAD设计工具,功能强大,而且易学易用,能帮助用户快速评估各种设计方案,包含质量特性计算、设计参数监视、运动分析、干涉检查等功能。它能帮助用户捕捉和实现用户的设计理念,适用于机械https://mall.cnki.net/magazine/Article/ZYJP202005050.htm
7.solidcenter(三维)工业设计软件软件solidcenter(三维)工业设计软件 关于我们|联系我们|产品展示 辽宁引利 1 2 辽宁引利智能技术有限公司 电话:024—81074667 毛经理:13840366689 陈经理:18602422243 您的当前位置: 软件 软件 友情链接:http://www.lnyinli.cn/content.php?id=449
8.javaweb013小时快速学习前端知识(收藏备用)手动可以做到的,用代码也可以实现。这就是DOM编程啦。 Document是树状结构。子节点有三种,element、attribute、text。 拿上面案例代码举例,可画出对应的树结构如下。 代码语言:javascript 复制 <html lang="en"> <head> <meta charset="UTF-8" /> <meta name="viewport" content="width=device-width, initialhttps://cloud.tencent.com/developer/article/2435006
9.亚龙SolidCenter三维设计软件软件名称亚龙Solid Center三维设计软件 软件简称立核三维设计软件版本号V1.0 登记号2020SR0215690分类号- 著作权人亚龙智能装备集团股份有限公司首次发表日期2019-10-18 登记日期2020-03-05 该公司其他软件著作权 序号登记日期软件全称软件简称登记号版本号 https://banquan.tianyancha.com/rj/1v94ec1ee0a1c2f1140b6e1ebl8ce7d8
10.SolidCenter(三维)工业设计软件中标结果一、合同编号:HT-2020-08768 二、合同名称:陕西省电子信息学校SolidCenter(三维)工业设计软件采购合同 三、项目编号:暂无 四、项目名称:暂无 五、合同主体 采购人(甲方):陕西省电子信息学校 地址: 联系方式: 供应商(乙方):亚龙智能装备集团股份有限公司 https://www.bidcenter.com.cn/newscontent-116496192-4.html
11.微信视频怎么开美颜微信视频美颜用什么软件最好微信视频美颜用什么软件最好微信自带美颜,另外也可以下载微信视频美颜大师、视频通话美颜大师等软件,这些软件也可以帮助开启微信视频美颜功能。微信视频美颜大师里面有相机功能,打开后发现不仅可以美颜,还能进行各种骚操作,比如滤镜、换发等等。我还尝试了用它进行微信视频通话,确实是可以美颜的,最主要的是对方也能看到你https://zhidao.baidu.com/question/2083494954127085668.html
12.9.0安装破解详细图文教程(附下载)图形图像软件教程无需任何额外的软件等文件,软件,SolidWorks,和,CATIA 等,NX 等,Solid Edge 和 Autodesk to Environment 应用程序,进入。 PTC 每年都会更新其 CAD 软件,因为您面临的挑战每年都在演变。 Creo 9 是关于客户驱动的增强功能、加速创新、增强协作和用事实代替假设的工具。以下是我们很高兴为您带来的功能 - 以及我https://www.jb51.net/softjc/826636.html
13.前端基础CSSBinb样式类名不要用数字开头(有的浏览器不认)。 标签中的class属性如果有多个,要用空格分隔。 通用选择器 *{样式1;样式2;} 组合选择器 后代选择器 选择器 子标签{样式1;} 儿子选择器 选择器>子标签{样式1;} 毗邻选择器#同级相邻 选择器+子标签{样式1;} https://www.cnblogs.com/binHome/p/11806088.html
14.德国汉诺威工业博览会,华天软件喊您参加!届时,华天软件将携SolidInsight、InforCenter PLM等产品重磅亮相。 SolidInsight SolidInsight是一款专业的掌上CAD看图软件,支持包括SOLIDWORKS、CREO/PROE、UG/NX、CATIA、Inventor、AutoCAD等主流软件格式。只需一部手机或平板,即可浏览3D模型与2D工程图,无需使用笨重的电脑或昂贵CAD软件。 https://www.hoteamsoft.com/news-1441
15.JavaScript构建Web和ArcGISServer应用实战在这个站点上,我们将发现用于创建和共享地图的应用程序,还可以找到可供查看和使用的有用底图、数据、应用程序和工具。另外,我们也可以加入该社区。对于应用程序开发人员来说,真正令人激动的消息是可以通过ArcGIS API for JavaScript集成ArcGIS.com内容到自定义开发的应用程序中。在本章中,我们将探索到ArcGIS.com地图是https://labs.epubit.com/bookDetails?id=N18049
16.工程制图软件UG的学习方法Solid Edge在全世界范围内拥有广泛的用户群体,包含来自世界数千家公司的设计人员,这些公司包括Alcoa、NEC 工程和沃尔沃。Solid Edge 航行者程序包括200 套集成的工程软件程序和计算机硬件解决方案。这个仅为机械用库及管道设计用库。 Imageware 广泛应用于汽车、航空、航天、消费家电、模具、计算机零部件领域。拥有广大的https://www.yjbys.com/edu/gongchengzhitu/400225.html
17.ug概述准确的说是UG软件的一部分,强大的CAM/CNC后置处理器。 Nastran 与NASA的Nastran同根同组,是军工及航空航天业强大的CAE软件,主要应用于线性问题求解。 I-DEAS 军方用高端软件,福特和日产使用,常用在CAE领域 SolidEdge Solid Edge是一款功能强大的三维计算机辅助设计软件,允许制造公司开展富有洞察力的设计并通过降低http://www.360doc.com/content/12/0403/04/4030559_200507348.shtml
18.solidcentereyedanger是什么意思沪江词库精选solid center eyed anger是什么意思、英语单词推荐 木工钻 相似短语 solid center eyed anger 木工钻 solid center eyed auger with one spur 单翼木工钻 solid center 整体顶尖 solid rolled center 整轧轮心 solid center bit 木工钻头 in anger 气愤地,愤怒地 solid center bit with https://www.hujiang.com/ciku/solid_center_eyed_anger/
19.SolidEdge2024新增功能,Solidedge金牌代理商,Solidedge正版SolidEdge2024新增功能,利用AI和云进行更智能的设计,更快地可视化和处理大型装配,将工程流程与销售和营销联系起来,按需灵活访问附加产品,无缝整合来自其他CAD软件的设计数据,体验SiemensXcelerator产品组合的强大功能。 Solid Edge 2024 新增功能:释放智能产品设计的强大威力 https://www.yaentek.com/1.html?article_id=61
20.Altair软件Hypermesh10功能操作详解(中文版).pdf正如指导中所述,当需要几何面却没有面的几何数据时,通过单元生成面(几何)是非常有用的。 对于通过 plot 单元生成的面,软件业提供了很多的控制工具。自动和半自动的操作方法会让你 的 plot 单元编辑工作迅速又简单。 Go to HyperMesh Tutorials 82 Creating and Editing Solid Geometry - HM-2060 此指导中,我们https://mip.book118.com/html/2023/0320/8106137066005047.shtm
21.fpga开发FPGA学习笔记1FPGA原理与开发流程当然,上述技能虽多,但不用害怕,没有人天生就懂软件/硬件开发,所有大佬都是从“Hello World”/点灯开始的。下面就是特权同学总结的FPGA三阶段: 1. 入门阶段 从无到有的阶段,初识FPGA,是不折不扣的“菜鸟”。 要初步了解FPGA是什么、能做什么等基本的理论。 要学会HDL语言,能够使用EDA工具完成FPGA的代码设计、http://51969.com/post/15795252.html