2022年iOS口试总结--不断更新当中ing

手机软件开发 2024-9-10 00:00:15 83 0 来自 中国
2020年的春天,成都的气候格外的闷热。
由于公司的缘故起因,导致我不得不思量去口试一家稳固成熟的大公司,自己从一开始也不绝空想着进入一家可以得到广阔平台的公司发展,有朝一日可以当上技术负责人,但是实际总是那么暴虐,4年了,4年了,每次口试感觉自己照旧只是会回复:我知道,但是没有深入研究过。这个我相识过,但是还没有处置处罚过。然后就是一个劲的出汗来排解心田的压力。3次换工作,口试过30-40次,每次都只是为了口试而口试(背题),很多东西都记取不。哎~ 我太难了~ 太难了~
不管口试是否通过,照旧来总结一下口试经常遇到的标题吧。
Object-C系列口试题总结
根本题:
1.Objective-C的类可以多重继续么?可以实现多个接口么?Category是什么?重写一个类的方式用继续好照旧分类好?为什么不要在category中重写一个类原有的方法?
<meta charset="utf-8">
答:
Objective-c的类不可以有多继续,OC内里都是单继续,多继续可以用protocol委托署理来模仿实现
可以实现多个接口,可以通过实现多个接口完成OC的多重继续
Category是类别;
⚠️重写一个类的方式用继续好照旧分类好:
重写一个类的方式用继续照旧分类.取决于详细情况.如果目的类有很多的子类.我们需要拓展这个类又不盼望影响到原有的代码.继续后比力好.
如果仅仅是拓展方法.分类更好.(不需要涉及到原先的代码)
分类中方法的优先级比原来类中的方法高,也就是说,在分类中重写了原来类中的方法,那么分类中的方法会覆盖原来类中的方法
⚠️为什么不要在category中重写一个类原有的方法:
1、category没有办法去取代子类,它不能像子类一样通过super去调用父类的方法实现。如果category中重写覆盖了当前类中的某个方法,那么这个当前类中的原始方法实现,将永世不会被实验,这在某些方法里是致命的。(ps:这里提一下,+(void)load方法是一个特例,它会在当前类实验完之后再在category中实验。)
2、同时,一个category也不能可靠的覆盖另一个category中类似的类的类似的方法。比方UIViewController+A与UIViewController+B,都重写了viewDidLoad,我们就无法控制谁覆盖了谁。
3、通过观察头文件我们可以发现,Cocoa框架中的很多类都是通过category来实现功能的,大概不经意间你就覆盖了这些方法中的其一,偶然候就会产生一些无法排查的非常缘故起因。
4、category的诞生只是为了让开发者更加方便的去拓展一个类,它的初志并不是让你去改变一个类。
结论:
要重写方法,固然我们首推通过子类重写父类的方法,在一些不方便重写的情况下,我们也可以在category中用runtime举行method swizzling(方法的偷梁换柱)来实现。
2.请阐明并比力以下关键词:strong, weak, assign, copy。

答:

  • strong表示指向并拥有该对象。其修饰的对象引用计数会增长1。该对象只要引用计数不为0则不会被烧毁。固然强行将其设为nil可以烧毁它。
  • weak表示指向但不拥有该对象。其修饰的对象引用计数不会增长。无需手动设置,该对象会自行在内存中烧毁。
  • assign重要用于修饰根本数据范例,如NSInteger和CGFloat,这些数值重要存在于栈上。
  • weak 一般用来修饰对象,assign一般用来修饰根本数据范例。缘故起因是assign修饰的对象被开释后,指针的地点依然存在,造成野指针,在堆上容易造成瓦解。而栈上的内存体系会主动处置处罚,不会造成野指针。
  • copy与strong类似。差别之处是strong的复制是多个指针指向同一个地点,而copy的复制每次会在内存中拷贝一份对象,指针指向差别地点。copy一般用在修饰有可变对应范例的不可变对象上,如NSString, NSArray, NSDictionary。
  • Objective-C 中,根本数据范例的默认关键字是atomic, readwrite, assign;平凡属性的默认关键字是atomic, readwrite, strong。
3.用@property声明的 NSString / NSArray / NSDictionary 经常利用 copy 关键字,为什么?如果改用strong关键字,大概造成什么标题?

答:用 @property 声明 NSString、NSArray、NSDictionary 经常利用 copy 关键字,是由于他们有对应的可变范例:NSMutableString、NSMutableArray、NSMutableDictionary,他们之间大概举行赋值操纵(就是把可变的赋值给不可变的),为确保对象中的字符串值不会偶然间变更,应该在设置新属性值时拷贝一份。1\. 由于父类指针可以指向子类对象,利用 copy 的目的是为了让本对象的属性不受外界影响,利用 copy 无论给我传入是一个可变对象照旧不可对象,我自己持有的就是一个不可变的副本。2\. 如果我们利用是 strong ,那么这个属性就有大概指向一个可变对象,如果这个可变对象在外部被修改了,那么会影响该属性。//总结:利用copy的目的是,防止把可变范例的对象赋值给不可变范例的对象时,可变范例对象的值发送变革会偶然间窜改不可变范例对象原来的值。复制代码4.浅拷贝和深拷贝的区别?

答:浅拷贝:只复制指向对象的指针,而不复制引用对象自己。深拷贝:复制引用对象自己。内存中存在了两份独立对象自己,当修改A时,A_copy稳固。复制代码iOS深浅拷贝
5.Objective-C 如何对内存管理的,说说你的见解息争决方法?

答:Objective-C的内存管理重要有三种方式ARC(主动内存计数)、手动内存计数、内存池。1). 主动内存计数ARC:由Xcode主动在App编译阶段,在代码中添加内存管理代码。2). 手动内存计数MRC:遵照内存谁申请、谁开释;谁添加,谁开释的原则。3). 内存开释池Release Pool:把需要开释的内存同一放在一个池子中,当池子被抽干后(drain),池子中全部的内存空间也被主动开释掉。内存池的开释操纵分为主动和手动。主动开释受runloop机制影响。复制代码6.继续、分类和类扩展

答:1\. 分类有名字,类扩展没有分类名字,是一种特别的分类。2\. 分类只能扩展方法(属性仅仅是声明,并没真正实现),类扩展可以扩展属性、成员变量和方法。3\. 继续可以增长,修改大概删除方法,并且可以增长属性。复制代码iOS中Category和Extension 原理详解
IOS 分类(category)、扩展(Extension)和继续(inheritance)的区别?
iOS 成员变量 实例变量 属性变量
7.我们说的OC是动态运行时语言是什么意思?

答:重要是将数据范例简直定由编译时,推迟到了运行时。简单来说, 运行机会制使我们直到运行时才去决定一个对象的类别,以及调用该类别对象指定方法。复制代码8.什么是 KVO 和 KVC?谈谈 KVC 以及 KVO 的明确?

答:KVC(key-value-coding)键值编码,是一种间接访问实例变量的方法。提供一种机制来间接访问对象的属性。1、给私有变量赋值。2、给控件的内下属性赋值(如自界说UITextFiled的clearButton,或placeholder的颜色,一般可利用runtime获取控件的内下属性名,Ivar *ivar = class_getInstanceVariable获取实例成员变量)。[textField setValue:[UIColor redColor] forKeyPath"placeholderLabel.textColor"];3、团结Runtime,model和字典的转换(setValuesForKeysWithDictionary,class_copyIvarList获取指定类的Ivar成员列表)KVO是一种基于KVC实现的观察者模式。当指定的被观察的对象的属性更改了,KVO会以主动或手动方式关照观察者。事例:监听 ScrollView 的 contentOffSet属性[scrollview addObserver:self forKeyPath"contentOffset"  options:NSKeyValueObservingOptionNew context:nil];复制代码KVO图
9.block的留意点

答:1\. 在block内部利用外部指针且会造成循环引用情况下,需要用__weak修饰外部指针:    __weak typeof(self) weakSelf = self; 2\. 在block内部如果调用了延时函数还利用弱指针会取不到该指针,由于已经被烧毁了,需要在block内部再将弱指针重新强引用一下。    __strong typeof(self) strongSelf = weakSelf;3\. 如果需要在block内部改变外部栈区变量的话,需要在用__block修饰外部变量。复制代码10.堆、栈和队列

答:1.从管理方式来讲对于栈来讲,是由编译器主动管理,无需我们手工控制;对于堆来说,开释工作由步调员控制,容易产生内存泄露(memory leak)2.从申请巨细巨细方面讲栈空间比力小堆控件比力大3.从数据存储方面来讲栈空间中一般存储根本范例,对象的地点堆空间一般存放对象自己,block的copy等复制代码答:# 堆堆是一种颠末排序的树形数据结构,每个节点都有一个值,通常我们所说的堆的数据结构是指二叉树。所以堆在数据结构中通常可以被看做是一棵树的数组对象。而且堆需要满意一下两个性子:1)堆中某个节点的值总是不大于或不小于其父节点的值;2)堆总是一棵完全二叉树。堆分为两种情况,有最大堆和最小堆。将根节点最大的堆叫做最大堆或大根堆,根节点最小的堆叫做最小堆或小根堆,在一个摆放好元素的最小堆中,父结点中的元素肯定比子结点的元素要小,但对于左右结点的巨细则没有规定谁大谁小。堆常用来实现优先队列,堆的存取是随意的,这就犹如我们在图书馆的书架上取书,虽然书的摆放是有顺序的,但是我们想取恣意一本时不必像栈一样,先取出前面全部的书,书架这种机制差别于箱子,我们可以直接取出我们想要的书。# 栈栈是限定仅在表尾举行插入和删除操纵的线性表。我们把允许插入和删除的一端称为栈顶,另一端称为栈底,不含任何数据元素的栈称为空栈。栈的特别之处在于它限定了这个线性表的插入和删除位置,它始终只在栈顶举行。栈是一种具有后进先出的数据结构,又称为后进先出的线性表,简称 LIFO(Last In First Out)结构。也就是说后存放的先取,先存放的后取,这就类似于我们要在取放在箱子底部的东西(放进去比力早的物体),我们起主要移开压在它上面的物体(放进去比力晚的物体)。堆栈中界说了一些操纵。两个最告急的是PUSH和POP。PUSH操纵在堆栈的顶部到场一个元素。POP操纵相反,在堆栈顶部移去一个元素,并将堆栈的巨细减一。栈的应用—递归# 队列队列是只允许在一端举行插入操纵、而在另一端举行删除操纵的线性表。允许插入的一端称为队尾,允许删除的一端称为队头。它是一种特别的线性表,特别之处在于它只允许在表的前端举行删除操纵,而在表的后端举行插入操纵,和栈一样,队列是一种操纵受限定的线性表。队列是一种先辈先出的数据结构,又称为先辈先出的线性表,简称 FIFO(First In First Out)结构。也就是说先放的先取,后放的后取,就犹如行李过安检的时间,先放进去的行李在另一端总是先出来,后放入的行李会在末了面出来。复制代码11.什么是多态?什么是分类?什么是协议?

答:多态在面向对象语言中指同一个接口有多种差别的实现方式,在OC中,多态则是差别对象对同一消息的差别相应方式;子类通过重写父类的方法来改变同一方法的实现.表现多态性平凡来讲: 多态就父类范例的指针指向子类的对象,在函数(方法)调用的时间可以调用到精确版本的函数(方法)。多态就是某一类事物的多种形态.继续是多态的条件;复制代码答:分类: 在不修改原有类代码的情况下,可以给类添加方法Categroy 给类扩展方法,大概关联属性, Categroy底层结构也是一个结构体:内部存储这结构体的名字,谁人类的分类,以及对象和类方法列表,协议,属性信息通过Runtime加载某个类的全部Category数据把全部Category的方法、属性、协议数据,归并到一个大数组中背面到场编译的Category数据,会在数组的前面将归并后的分类数据(方法、属性、协议),插入到类原来数据的前面复制代码答:协议:协议是一套标准,这个标准中声明确很多方法,但是不关心详细这些方法是怎么实现的,详细实现是由遵照这个协议的类去完成的。在OC中,一个类可以实现多个协议,通过协议可以增补单继续的缺陷但是协议跟继续不一样,协议只是一个方法列表,方法的实现得靠遵照这个协议的类去实现。复制代码12.UIView 和 CALayer 是什么关系?

答:UIView 继续 UIResponder,而 UIResponder 是相应者对象,可以对iOS 中的变乱相应及转达,CALayer 没有继续自 UIResponder,所以 CALayer 不具备相应处置处罚变乱的本事。CALayer 是 QuartzCore 中的类,是一个比力底层的用来绘制内容的类,用来绘制UIUIView 对 CALayer 封装属性,对 UIView 设置 frame、center、bounds 等位置信息时,实在都是UIView 对 CALayer 进一层封装,使得我们可以很方便地设置控件的位置;比方圆角、阴影等属性, UIView 就没有进一步封装,所以我们照旧需要去设置 Layer 的属性来实现功能。UIView 是 CALayer 的署理,UIView 持有一个 CALayer 的属性,并且是该属性的署理,用来提供一些 CALayer 行的数据,比方动画和绘制。复制代码13.说一下 JS 和 OC 相互调用的几种方式?

答:js调用oc的三种方式:方式一:通过替换js中的function(方法)方式二:通过注入对象,直接调用对象方法方式三:利用网页重定向,截取字符串.oc调用js代码两种方式1.通过webVIew调用 webView stringByEvaluatingJavaScriptFromString: 调用2.通过JSContext调用[context evaluateScript:];复制代码14.如何明确HTTP?/Http 和 Https 的区别?Https为什么更加安全?

答:HTTP本质上是一种协议,全称是Hypertext Transfer Protocol,即超文本传输协议。HTTP是一个基于TCP/IP通讯协议来转达数据, 该协议用于规定客户端与服务端之间的传输规则,所传输的内容不范围于文本(实在可以传输恣意范例的数据)。一次HTTP可以看做是一个事件,其工作过程分为4步:1.客户端与服务器创建毗连2.创建毗连后,客户端给服务端发送哀求3.服务器收到消息后,给与相应操纵4.客户端收到消息后,展示到屏幕上,断开毗连.复制代码答:区别1.HTTPS 需要向机构申请 CA 证书,极少免费。2.HTTP 属于明文传输,HTTPS基于 SSL 举行加密传输。3.HTTP 端标语为 80,HTTPS 端标语为 443 。4.HTTPS 是加密传输,有身份验证的环节,更加安全。安全SSL(安全套接层) TLS(传输层安全)以上两者在传输层之上,对网络毗连举行加密处置处罚,保障数据的完备性,更加的安全。复制代码15.编程中的六大操持原则?

答:1.单一职责原则平凡地讲就是一个类只做一件事CALayer:动画和视图的表现。UIView:只负责变乱转达、变乱相应。2.开闭原则对修改关闭,对扩睁开放。 要思量到后续的扩展性,而不是在原有的根本上来回修改3.接口隔离原则利用多个专门的协议、而不是一个巨大痴肥的协议,如 UITableviewDelegate + UITableViewDataSource4.依靠倒置原则抽象不应该依靠于详细实现、详细实现可以依靠于抽象。 调用接口感觉不到内部是如何操纵的5.里氏替换原则父类可以被子类无缝替换,且原有的功能不受任何影响 如:KVO6.迪米特法则一个对象应当对其他对象尽大概少的相识,实现高聚合、低耦合复制代码16.Objective-C与Swift的异同?

答:1.1、swift和OC的共同点: - OC出现过的绝大多数概念,好比引用计数、ARC(主动引用计数)、属性、协议、接口、初始化、扩展类、定名参数、匿名函数等,在Swift中继续有用(大概最多换个术语)。 - Swift和Objective-C共用一套运行时情况,Swift的范例可以桥接到Objective-C(下面我简称OC),反之亦然1.2、swift的长处: - swift留意安全,OC留意灵活 - swift留意面向协议编程、函数式编程、面向对象编程,OC留意面向对象编程 - swift留意值范例,OC留意指针和引用 - swift是静态范例语言,OC是动态范例语言 - swift容易阅读,文件结构和大部门语法浅易化,只有.swift文件,末端不需要分号 - swift中的可选范例,是用于全部数据范例,而不但仅范围于类。相比于OC中的nil更加安全和简明 - swift中的泛型范例更加方便和通用,而非OC中只能为聚集范例添加泛型 - swift中各种方便快捷的高阶函数(函数式编程) (Swift的标准数组支持三个高阶函数:map,filter和reduce,以及map的扩展flatMap) - swift新增了两种权限,细化权限。open > public > internal(默认) > fileprivate > private - swift中独有的元组范例(tuples),把多个值组合成复合值。元组内的值可以是任何范例,并不要求是类似范例的。复制代码17.沙盒目次结构是怎样的?各自用于那些场景?

答:Application:存放步调源文件,上架前颠末数字署名,上架后不可修改Documents:常用目次,iCloud备份目次,存放数据LibraryCaches:存放体积大又不需要备份的数据Preference:设置目次,iCloud会备份设置信息tmp:存放暂时文件,不会被备份,而且这个文件下的数据有大概随时被清除的大概复制代码17.iOS中数据长期化方案有哪些?

答:NSUserDefault 简单数据快速读写Property list (属性列表)文件存储Archiver (归档)SQLite 当地数据库CoreData(是iOS5之后才出现的一个框架,本质上是对SQLite的一个封装,它提供了对象-关系映射(ORM)的功能,即可以大概将OC对象转化成数据,生存在SQLite数据库文件中,也可以大概将生存在数据库中的数据还原成OC对象,通过CoreData管理应用步调的数据模子)复制代码18.单个viewController的生命周期?

答:- initWithCoderNSCoder *)aDecoder:(如果利用storyboard大概xib)- loadView:加载view- viewDidLoad:view加载完毕- viewWillAppear:控制器的view将要表现- viewWillLayoutSubviews:控制器的view将要结构子控件- viewDidLayoutSubviews:控制器的view结构子控件完成  - viewDidAppear:控制器的view完全表现- viewWillDisappear:控制器的view即将消散的时间- viewDidDisappear:控制器的view完全消散的时间- dealloc 控制器烧毁复制代码19.cocoa 和 cocoa touch是什么?/cocoa touch底层技术架构?

答:Cocoa包罗Foundation和AppKit框架,可用于开发Mac OS X体系的应用步调。Cocoa Touch包罗Foundation和UIKit框架,可用于开发iPhone OS体系的应用步调。Cocoa是 Mac OS X 的开发情况,Cocoa Touch是 iPhone OS的开发情况。复制代码答:cocoa touch底层技术架构 重要分为4层:可触摸层 Cocoa Touch : UI组件,触摸变乱和变乱驱动,体系接口媒体层 Media: 音视频播放,动画,2D和3D图形Core Server: 焦点折务层,底层特性,文件,网络,位置服务区等Core OS: 内存管理,底层网络,硬盘管理复制代码20. 如何选择delegate、notification、KVO?

答:三种模式都是一个对象转达变乱给别的一个对象,并且不要他们有耦合。delegate. 一对一notification 一对多,多对多KVO 一对一三者各有自己的特点:delegate 语法简便,方便阅读,易于调试notification 灵活多变,可以超过多个类之间举利用用KVO 实现属性监听,实现model和view同步可以根据实际开发遇到的场景来利用差别的方式复制代码21.平常开发有没有玩过 Instrument ?

答:Instruments内里工具很多,常用的有:(1).Time Profiler:性能分析,用来检测应用CPU的利用情况.可以看到应用步调中各个方法正在斲丧CPU时间。(2).Zoombies:查抄是否访问了僵尸对象,但是这个工具只能从上往下查抄,不智能(3).Allocations:用来查抄内存,写算法的那批人也用这个来查抄(4).Leaks:查抄内存,看是否有内存走漏(5).Core Animation:评估图形性能,这个选项查抄了图片是否被缩放,以及像素是否对齐。被放缩的图片会被标记为黄色,像素不对齐则会标注为紫色。黄色、紫色越多,性能越差。复制代码常用的排序算法

答:选择排序、冒泡排序、插入排序三种排序算法可以总结为如下:都将数组分为已排序部门和未排序部门。选择排序将已排序部门界说在左端,然后选择未排序部门的最小元素和未排序部门的第一个元素互换。冒泡排序将已排序部门界说在右端,在遍历未排序部门的过程实验互换,将最大元素互换到最右端。插入排序将已排序部门界说在左端,将未排序部门元的第一个元素插入到已排序部门符合的位置。/**  *  【选择排序】:最值出如今起始端 *   *  第1趟:在n个数中找到最小(大)数与第一个数互换位置 *  第2趟:在剩下n-1个数中找到最小(大)数与第二个数互换位置 *  重复如许的操纵...依次与第三个、第四个...数互换位置 *  第n-1趟,终极可实现数据的升序(降序)排列。 * */void selectSort(int *arr, int length) {    for (int i = 0; i < length - 1; i++) { //趟数        for (int j = i + 1; j < length; j++) { //比力次数            if (arr > arr[j]) {                int temp = arr;                arr = arr[j];                arr[j] = temp;            }        }    }}/**  *  【冒泡排序】:相邻元素两两比力,比力完一趟,最值出如今末端 *  第1趟:依次比力相邻的两个数,不断互换(小数放前,大数放后)逐个推进,最值末了出如今第n个元素位置 *  第2趟:依次比力相邻的两个数,不断互换(小数放前,大数放后)逐个推进,最值末了出如今第n-1个元素位置 *   ……   …… *  第n-1趟:依次比力相邻的两个数,不断互换(小数放前,大数放后)逐个推进,最值末了出如今第2个元素位置  */void bublleSort(int *arr, int length) {    for(int i = 0; i < length - 1; i++) { //趟数        for(int j = 0; j < length - i - 1; j++) { //比力次数            if(arr[j] > arr[j+1]) {                int temp = arr[j];                arr[j] = arr[j+1];                arr[j+1] = temp;            }        }     }}/** *  折半查找:优化查找时间(不消遍历全部数据) * *  折半查找的原理: *   1> 数组必须是有序的 *   2> 必须已知min和max(知道范围) *   3> 动态盘算mid的值,取出mid对应的值举行比力 *   4> 如果mid对应的值大于要查找的值,那么max要变小为mid-1 *   5> 如果mid对应的值小于要查找的值,那么min要变大为mid+1 * */ // 已知一个有序数组, 和一个key, 要求从数组中找到key对应的索引位置 int findKey(int *arr, int length, int key) {    int min = 0, max = length - 1, mid;    while (min <= max) {        mid = (min + max) / 2; //盘算中心值        if (key > arr[mid]) {            min = mid + 1;        } else if (key < arr[mid]) {            max = mid - 1;        } else {            return mid;        }    }    return -1;}复制代码SDWebImage加载图片过程

答:0、起首表现占位图1、在webimagecache中探求图片对应的缓存,它是以url为数据索引先在内存中查找是否有缓存;2、如果没有缓存,就通过md5处置处罚过的key来在磁盘中查找对应的数据,如果找到就会把磁盘中的数据加到内存中,并表现出来;3、如果内存和磁盘中都没有找到,就会向远程服务器发送哀求,开始下载图片;4、下载完的图片到场缓存中,并写入到磁盘中;5、整个获取图片的过程是在子线程中举行,在主线程中表现。复制代码AFNetworking 底层原理分析

答:AFNetworking是封装的NSURLSession的网络哀求,由五个模块构成:分别由NSURLSession,Security,Reachability,Serialization,UIKit五部门构成NSURLSession:网络通讯模块(焦点模块) 对应 AFNetworking中的 AFURLSessionManager和对HTTP协议举行特化处置处罚的AFHTTPSessionManager,AFHTTPSessionManager是继续于AFURLSessionmanager的Security:网络通讯安全策略模块  对应 AFSecurityPolicyReachability:网络状态监听模块 对应AFNetworkReachabilityManagerSeriaalization:网络通讯信息序列化、反序列化模块 对应 AFURLResponseSerializationUIKit:对于iOS UIKit的扩展库复制代码进阶题:

1.KVC的底层实现?

答:当一个对象调用setValue方法时,方法内部会做以下操纵:1). 查抄是否存在相应的key的set方法,如果存在,就调用set方法。2). 如果set方法不存在,就会查找与key类似名称并且带下划线的成员变量,如果有,则直接给成员变量属性赋值。3). 如果没有找到_key,就会查找类似名称的属性key,如果有就直接赋值。4). 如果还没有找到,则调用valueForUndefinedKey:和setValue:forUndefinedKey:方法。这些方法的默认实现都是抛出非常,我们可以根据需要重写它们。复制代码2.KVO的底层实现?

答:KVO-键值观察机制,原理如下:1.当给A类添加KVO的时间,runtime动态的天生了一个子类NSKVONotifying_A,让A类的isa指针指向NSKVONotifying_A类,重写class方法,埋伏对象真实类信息2.重写监听属性的setter方法,在setter方法内部调用了Foundation 的 _NSSetObjectValueAndNotify 函数3._NSSetObjectValueAndNotify函数内部a) 起首会调用 willChangeValueForKeyb) 然后给属性赋值c) 末了调用 didChangeValueForKeyd) 末了调用 observer 的 observeValueForKeyPath 去告诉监听器属性值发生了改变 .4.重写了dealloc做一些 KVO 内存开释复制代码3.说一下工作中你怎么做性能优化的

答:一般都是说关于tableView的优化处置处罚,造成tableView卡顿的缘故起因1.没有利用cell的重用标识符,导致不绝创建新的cell2.cell的重新结构3.没有提前盘算并缓存cell的属性及内容4.cell中控件的数目过多5.利用了ClearColor,无配景色,透明度为06.更新只利用tableView.reloadData()(如果只是更新某组的话,利用reloadSection举行局部更新)7.加载网络数据,下载图片,没有利用异步加载,并缓存8.利用addView 给cell动态添加view9.没有按需加载cell(cell滚动很快时,只加载范围内的cell)10.实现无用的署理方法(tableView只服从两个协议)11.没有做缓存行高(estimatedHeightForRow不能和HeightForRow内里的layoutIfNeed同时存在,这两者同时存在才会出现“窜动”的bug。发起是:只要是固定行高就写预估行高来淘汰行高调用次数提升性能。如果是动态行高就不要写预估方法了,用一个行高的缓存字典来淘汰代码的调用次数即可)12.做了多余的绘制工作(在实现drawRect:的时间,它的rect参数就是需要绘制的地区,这个地区之外的不需要举行绘制)13.没有预渲染图像。(当新的图像出现时,仍旧会有短暂的停顿现象。解决的办法就是在bitmap context里先将其画一遍,导出成UIImage对象,然后再绘制到屏幕)提升tableView的流畅度*本质上是低落 CPU、GPU 的工作,从这两个大的方面去提升性能。  1.CPU:对象的创建和烧毁、对象属性的调解、结构盘算、文本的盘算和排版、图片的格式转换息争码、图像的绘制  2.GPU:纹理的渲染卡顿优化在 CPU 层面1.只管用轻量级的对象,好比用不到变乱处置处罚的地方,可以思量利用 CALayer 取代 UIView2.不要频仍地调用 UIView 的干系属性,好比 frame、bounds、transform 等属性,只管淘汰不须要的修改3.只管提前盘算好结构,在有需要时一次性调解对应的属性,不要多次修改属性4.Autolayout 会比直接设置 frame 斲丧更多的 CPU 资源5.图片的 size 最好刚好跟 UIImageView 的 size 保持划一6.控制一下线程的最大并发数目7.只管把耗时的操纵放到子线程8.文本处置处罚(尺寸盘算、绘制)9.图片处置处罚(解码、绘制)卡顿优化在 GPU层面1.只管克制短时间内大量图片的表现,尽大概将多张图片合成一张举行表现2.GPU能处置处罚的最大纹理尺寸是 4096x4096,一旦高出这个尺寸,就会占用 CPU 资源举行处置处罚,所以纹理只管不要高出这个尺寸3.只管淘汰视图数目和条理4.淘汰透明的视图(alpha<1),不透明的就设置 opaque 为 YES5.只管克制出现离屏渲染复制代码iOS 保持界面流畅的本事
5.Runtime实现的机制是什么?能做什么变乱呢?

答:runtime简称运行时。OC是运行机会制,也就是在运行时才做一些处置处罚。比方:C语言在编译的时间就知道要调用哪个方法函数,而OC在编译的时间并不知道要调用哪个方法函数,只有在运行的时间才知道调用的方法函数名称,来找到对应的方法函数举行调用。1.发送消息【场景:方法调用】2.互换方法实现(互换体系的方法)【场景:当第三方框架大概体系原生方法功能不能满意我们的时间,我们可以在保持体系原有方法功能的根本上,添加额外的功能。】3.动态添加方法【场景:如果一个类方法非常多,加载类到内存的时间也比力淹灭资源,需要给每个方法天生映射表,可以利用动态给某个类,添加方法解决。】4.利用关联对象(AssociatedObject)给分类添加属性【 场景:分类是不能自界说属性和变量的,这时间可以利用runtime动态添加属性方法; 原理:给一个类声明属性,实在本质就是给这个类添加关联,并不是直接把这个值的内存空间添加到类存空间。 】5.遍历类的全部成员变量【  1.NSCoding主动归档解档  场景:如果一个模子有很多个属性,实现自界说模子数据长期化时,需要对每个属性都实现一遍encodeObject 和 decodeObjectForKey方法,比力贫苦。我们可以利用Runtime来解决。  原理:用runtime提供的函数遍历Model自身全部属性,并对属性举行encode和decode操纵。  2.字典转模子  原理:利用Runtime,遍历模子中全部属性,根据模子的属性名,去字典中查找key,取出对应的值,给模子的属性赋值。  3.修改textfield的占位笔墨颜色】6.利用消息转发机制解决方法找不到的非常标题复制代码教你深刻明确Runtime机制
Runtime在工作中的运用
Runtime运行机制
6.iOS图片设置圆角性能标题

答:1.直接利用setCornerRadius【如许设置会触发离屏渲染,比力斲丧性能。好比当一个页面上有十几头像如许设置了圆角会显着感觉到卡顿。 留意:png图片UIImageView处置处罚圆角是不会产生离屏渲染的。(ios9.0之后不会离屏渲染,ios9.0之前照旧会离屏渲染) 】 2.setCornerRadius设置圆角之后,shouldRasterize=YES光栅化 【avatarImageView.layer.shouldRasterize = YES;   avatarImageViewUrl.layer.rasterizationScale=[UIScreen mainScreen].scale;  //UIImageView不加这句会产生一点暗昧  shouldRasterize=YES设置光栅化,可以使离屏渲染的效果缓存到内存中存为位图,利用的时间直接利用缓存,节省了不绝离屏渲染斲丧的性能。  但是如果layer及sublayers经常改变的话,它就会不绝不绝的渲染及删除缓存重新创建缓存,所以这种情况下发起不要利用光栅化,如许也是比力斲丧性能的。 】 3.直接覆盖一张中心为圆形透明的图片(保举利用) 4.UIImage drawInRect绘制圆角【这种方式GPU斲丧低内存占用大,而且UIButton上不知道怎么绘制,可以用UIimageView添加个点击手势当做UIButton利用。】5.SDWebImage处置处罚图片时Core Graphics绘制圆角(暂时感觉是最优方法)复制代码iOS图片设置圆角性能标题
7.什么是 RunLoop?

答:从字面上讲就是运行循环,它内部就是do-while循环,在这个循环内部不断地处置处罚各种任务。一个线程对应一个RunLoop,根本作用就是保持步调的一连运行,处置处罚app中的各种变乱。通过runloop,有事运行,没事就苏息,可以节省cpu资源,进步步调性能。主线程的run loop默认是启动的。iOS的应用步调内里,步调启动后会有一个如下的main()函数int main(int argc, char * argv[]) {    @autoreleasepool {        return UIApplicationMain(argc, argv, nil, NSStringFromClass([AppDelegate class]));    }}复制代码答:RunLoop,是多线程的法宝,即一个线程一次只能实验一个任务,实验完任务后就会退出线程。主线程实验完即时任务时会继续期待吸收变乱而不退出。非主线程通常来说就是为了实验某一任务的,实验完毕就需要归还资源,因此默认是不运行RunLoop的;每一个线程都有其对应的RunLoop,只是默认只有主线程的RunLoop是启动的,其它子线程的RunLoop默认是不启动的,若要启动则需要手动启动;在一个单独的线程中,如果需要在处置处罚完某个任务后不退出,继续期待吸收变乱,则需要启用RunLoop;NSRunLoop提供了一个添加NSTimer的方法,可以指定Mode,如果要让任何情况下都回调,则需要设置Mode为Common模式;实质上,对于子线程的runloop默认是不存在的,由于苹果接纳了懒加载的方式。如果我们没有手动调用[NSRunLoop currentRunLoop]的话,就不会去查询是否存在当火线程的RunLoop,也就不会去加载,更不会创建。复制代码深入明确RunLoop
8.以scheduledTimerWithTimeInterval的方式触发的timer,在滑动页面上的列表时,timer会停息,为什么?该如何解决?

答:缘故起因在于滑动时当火线程的runloop切换了mode用于列表滑动,导致timer停息。runloop中的mode重要用来指定变乱在runloop中的优先级,有以下几种:* Default(NSDefaultRunLoopMode):默认,一般情况下利用;* Connection(NSConnectionReplyMode):一般体系用来处置处罚NSConnection干系变乱,开发者一般用不到;* Modal(NSModalPanelRunLoopMode):处置处罚modal panels变乱;* Event Tracking(NSEventTrackingRunLoopMode):用于处置处罚拖拽和用户交互的模式。* Common(NSRunloopCommonModes):模式合集。默认包罗Default,Modal,Event Tracking三大模式,可以处置处罚险些全部变乱。回到题中的情境。滑动列表时,runloop的mode由原来的Default模式切换到了Event Tracking模式,timer原来好好的运行在Default模式中,被关闭后自然就克制工作了。解决方法其一是将timer到场到NSRunloopCommonModes中。其二是将timer放到另一个线程中,然后开启另一个线程的runloop,如允许以包管与主线程互不干扰,而如今主线程正在处置处罚页面滑动。复制代码方法1[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];方法2dispatch_async(dispatch_get_global_queue(0, 0), ^{timer = [NSTimer scheduledTimerWithTimeInterval:1 target:self selectorselector(repeat userInfo:nil repeats:true];[[NSRunLoop currentRunLoop] run];});复制代码9.历程与线程

答:历程:1.历程是一个具有肯定独立功能的步调关于某次数据聚集的一次运行运动,它是操纵体系分配资源的根本单元.2.历程是指在体系中正在运行的一个应用步调,就是一段步调的实验过程,我们可以明确为手机上的一个app.3.每个历程之间是独立的,每个历程均运行在其专用且受掩护的内存空间内,拥有独立运行所需的全部资源线程1.步调实验流的最小单元,线程是历程中的一个实体.2.一个历程要想实验任务,必须至少有一条线程.应用步调启动的时间,体系会默认开启一条线程,也就是主线程历程和线程的关系1.线程是历程的实验单元,历程的全部任务都在线程中实验2.线程是 CPU 分配资源和调治的最小单元3.一个步调可以对应多个历程(多历程),一个历程中可有多个线程,但至少要有一条线程4.同一个历程内的线程共享历程资源复制代码10.iOS中实现多线程的几种方案,各自有什么特点?讲一下详细利用场景/在项目什么时间选择利用 GCD,什么时间选 择 NSOperation?

答:NSThread 面向对象的,需要步调员手动创建线程,但不需要手动烧毁。子线程间通讯很难。GCD c语言,充实利用了装备的多核,主动管理线程生命周期。比NSOperation服从更高。NSOperation 基于gcd封装,更加面向对象,比gcd多了一些功能。【场景:1.多个网络哀求完成后实验下一步 2.多个网络哀求顺序实验后实验下一步 3.异步操纵两组数据时, 实验完第一组之后, 才气实验第二组】复制代码答:项目中利用 NSOperation 的长处是 NSOperation 是对线程的高度抽象,在项目中使 用它,会使项目的步调结构更好,子类化 NSOperation 的操持思绪,是具有面向对 象的长处(复用、封装),使得实现是多线程支持,而接口简单,发起在复杂项目中 利用。项目中利用 GCD 的长处是 GCD 自己非常简单、易用,对于不复杂的多线程操 作,会节省代码量,而 Block 参数的利用,会是代码更为易读,发起在简单项目中 利用。复制代码11.什么是GCD?GCD 的队列范例?

答:GCD(Grand Central Dispatch), 又叫做大中心调治, 它对线程操纵举行了封装,到场了很多新的特性,内部举行了服从优化,提供了简便的C语言接口, 利用更加高效,也是苹果保举的利用方式.GCD的队列可以分为2大范例1.并发队列(Concurrent Dispatch Queue)可以让多个任务并发(同时)实验(主动开启多个线程同时实验任务)并发功能只有在异步(dispatch_async)函数下才有用2.串行队列(Serial Dispatch Queue)让任务一个接着一个地实验(一个任务实验完毕后,再实验下一个任务),按照FIFO顺序实验.复制代码12.什么是同步和异步任务派发(synchronous和asynchronous)?

答:GCD多线程经常会利用 dispatch_sync和dispatch_async函数向指定队列添加任务,分别是同步和异步同步:指阻塞当火线程,既要期待添加的耗时任务块Block完成后,函数才气返回,背面的代码才气继续实验异步:指将任务添加到队列后,函数立刻返回,背面的代码不消期待添加的任务完成后即可实验,异步提交无法确定任务实验顺序复制代码13.dispatch_barrier_(a)sync利用?

答:栅栏函数一个dispatch barrier 允许在一个并发队列中创建一个同步点。当在并发队列中遇到一个barrier, 他会耽误实验barrier的block,期待全部在barrier之条件交的blocks实验竣事。 这时,barrier block自己开始实验。 之后, 队列继续正常的实验操纵。复制代码14.对称加密和非对称加密的区别?

答:1、对称加密又称公开密钥加密,加密息争密都会用到同一个密钥,如果密钥被攻击者得到,此时加密就失去了意义。常见的对称加密算法有DES、3DES、AES、Blowfish、IDEA、RC5、RC6。2、非对称加密又称共享密钥加密,利用一对非对称的密钥,一把叫做私有密钥,另一把叫做公有密钥;公钥加密只能用私钥来解密,私钥加密只能用公钥来解密。常见的公钥加密算法有:RSA、ElGamal、背包算法、Rabin(RSA的特例)、迪菲-赫尔曼密钥互换协议中的公钥加密算法、椭圆曲线加密算法)。复制代码15.组件化有什么利益?

答:业务分层、解耦,使代码变得可维护;有用的拆分、构造日益巨大的工程代码,使工程目次变得可维护;便于各业务功能拆分、抽离,实现真正的功能复用;业务隔离,跨团队开发代码控制和版本风险控制的实现;模块化对代码的封装性、公道性都有肯定的要求,提升开发同砚的操持本事;在维护好各级组件的情况下,随意组合满意差别客户需求;(只需要将之前的多个业务组件模块在新的主App中举行组装即可快速迭代出下一个全新App)复制代码16.你是如何组件化解耦的?

答:分层根本功能组件:按功能分库,不涉及产物业务需求,跟库Library类似,通过精良的接口拱上层业务组件调用;不写入产物定制逻辑,通过扩展接口完成定制;根本UI组件:各个业务模块依靠利用,但需要保持好定制扩展的操持业务组件:业务功能间相对独立,相互间没有Model共享的依靠;业务之间的页面调用只能通过UIBus举行跳转;业务之间的逻辑Action调用只能通过服务提供;中心件:target-action,url-block,protocol-class复制代码iOS组件化方案的几种实现
17.APP启动时间应从哪些方面优化?

答:App启动时间可以通过xcode提供的工具来度量,在Xcode的Product->Scheme-->Edit Scheme->Run->Auguments中,将情况变量DYLD_PRINT_STATISTICS设为YES,优化需以下方面入手dylib loading time焦点头脑是淘汰dylibs的引用归并现有的dylibs(最好是6个以内)利用静态库rebase/binding time焦点头脑是淘汰DATA块内的指针淘汰Object C元数据量,淘汰Objc类数目,淘汰实例变量和函数(与面向对象操持头脑辩论)淘汰c++虚函数多利用Swift结构体(保举利用swift)ObjC setup time焦点头脑同上,这部门内容根本上在上一阶段优化过后就不会太过耗时initializer time利用initialize替换load方法淘汰利用c/c++的attribute((constructor));保举利用dispatch_once() pthread_once() stdnce()等方法保举利用swift不要在初始化中调用dlopen()方法,由于加载过程是单线程,无锁,如果调用dlopen则会变成多线程,会开启锁的斲丧,同时有大概死锁不要在初始化中创建线程复制代码iOS App 启动过程(一):根本概念
iOS App 启动过程(二):从 exec() 到 main()
iOS App 启动过程(三):main() 及生命周期
Swift系列口试题总结

根本题:

1.类(class) 和 结构体(struct) 有什么区别? 类(class) 和 结构体(struct) 比力,优缺点?

答:struct是值范例,class是引用范例。值范例的变量直接包罗它们的数据,对于值范例都有它们自己的数据副本,因此对一个变量操纵不大概影响另一个变量。引用范例的变量存储对他们的数据引用,因今后者称为对象,因此对一个变量操纵大概影响另一个变量所引用的对象。二者的本质区别:struct是深拷贝,拷贝的是内容;class是浅拷贝,拷贝的是指针。property的初始化差别:class 在初始化时不能直接把 property 放在 默认的constructor 的参数里,而是需要自己创建一个带参数的constructor;而struct可以,把属性放在默认的constructor 的参数里。变量赋值方式差别:struct是值拷贝;class是引用拷贝。immutable变量:swift的可变内容和不可变内容用var和let来甄别,如果初始为let的变量再去修改会发生编译错误。struct遵照这一特性;class不存在如许的标题。mutating function: struct 和 class 的差別是 struct 的 function 要去改变 property 的值的时间要加上 mutating,而 class 不消。继续: struct不可以继续,class可以继续。struct比class更轻量:struct分配在栈中,class分配在堆中。复制代码答:class 有以下功能,struct 是没有的:class可以继续,子类可以利用父类的特性和方法范例转换可以在运行时查抄息争释一个实例对象class可以用 deinit来开释资源一个类可以被多次引用struct 上风:结构较小,实用于复制操纵,相比力一个class 实例被多次引用,struct 更安全无需担心内存泄露标题复制代码2.Swift 是面向对象照旧函数式的编程语言?

答:Swift 既是面向对象的,又是函数式的编程语言。说 Swift 是面向对象的语言,是由于 Swift 支持类的封装、继续、和多态,从这点上来看与 Java 这类纯面向对象的语言险些毫无差别。说 Swift 是函数式编程语言,是由于 Swift 支持 map, reduce, filter, flatmap 这类去除中心状态、数学函数式的方法,更加夸大运算效果而不是中心过程。复制代码3.什么是泛型,swift哪些地方利用了泛型?

答:泛型(generic)可以使我们在步调代码中界说一些可变的部门,在运行的时间指定。利用泛型可以最大限度地重用代码、掩护范例的安全以及进步性能。泛型可以将范例参数化,进步代码复用率,淘汰代码量。比方 optional 中的 map、flatMap 、?? (泛型加逃逸闭包的方式,做三目运算)复制代码Swift 泛型
4.swift 语法糖 ? !的本质(实现原理)

答:?为optional的语法糖optional<T> 是一个包罗了nil 和平凡范例的摆列,确保利用者在变量为nil的情况下处置处罚!为optional 欺压解包的语法糖复制代码5.什么是可选型(Optional),Optional(可选型) 是用什么实现的

答:1.在 Swift 中,可选型是为了表达一个变量为空的情况,当一个变量为空,他的值就是 nil在范例名称背面加个问号? 来界说一个可选型值范例大概引用范例都可以是可选型变量2.Optional 是一个泛型摆列大抵界说如下:enum Optional<Wrapped> {  case none  case some(Wrapped)}除了利用 let someValue: Int? = nil 之外, 还可以利用let optional1: Optional<Int> = nil 来界说复制代码6.什么是高阶函数

答:一个函数如果可以以某一个函数作为参数, 大概是返回值, 那么这个函数就称之为高阶函数, 如 map, reduce, filter复制代码7.如何解决引用循环

答:转换为值范例, 只有类会存在引用循环, 所以如果能不消类, 是可以解引用循环的,delegate 利用 weak 属性.闭包中, 对有大概发生循环引用的对象, 利用 weak 大概 unowned, 修饰复制代码8.界说静态方法时关键字 static 和 class 有什么区别

答:static 界说的方法不可以被子类继续, class 则可以class AnotherClass {    static func staticMethod(){}    class func classMethod(){}}class ChildOfAnotherClass: AnotherClass {    override class func classMethod(){}    //override static func staticMethod(){}// error}复制代码9.请阐明并比力以下关键词:Open, Public, Internal, File-private, Private

答:Swift 有五个级别的访问控制权限,从高到底依次为好比 Open, Public, Internal, File-private, Private。他们遵照的根本原则是:高级别的变量不允许被界说为低级别变量的成员变量。好比一个 private 的 class 中不能含有 public 的 String。反之,低级别的变量却可以界说在高级别的变量中。好比 public 的 class 中可以含有 private 的 Int。Open 具备最高的访问权限。其修饰的类和方法可以在恣意 Module 中被访问和重写;它是 Swift 3 中新添加的访问权限。Public 的权限仅次于 Open。与 Open 唯一的区别在于它修饰的对象可以在恣意 Module 中被访问,但不能重写。Internal 是默认的权限。它表示只能在当前界说的 Module 中访问和重写,它可以被一个 Module 中的多个文件访问,但不可以被其他的 Module 中被访问。File-private 也是 Swift 3 新添加的权限。其被修饰的对象只能在当前文件中被利用。比方它可以被一个文件中的 class,extension,struct 共同利用。Private 是最低的访问权限。它的对象只能在界说的作用域内利用。离开了这个作用域,纵然是同一个文件中的其他作用域,也无法访问。复制代码10.swift中,关键字 guard 和 defer 的用法 guard也是基于一个表达式的布尔值去判定一段代码是否该被实验。与if语句差别的是,guard只有在条件不满意的时间才会实验这段代码。

答:guard let name = self.text else {  return }复制代码defer的用法是,这条语句并不会立刻实验,而是被推入栈中,直到函数竣事时才再次被调用。defer {   //函数竣事才调用}复制代码11.关键字:Strong,Weak,Unowned 区别?

答:Swift 的内存管理机制同OC划一,都是ARC管理机制; Strong,和 Weak用法同OC一样Unowned(无主引用), 不会产生强引用,实例烧毁后仍旧存储着实例的内存地点(类似于OC中的unsafe_unretained), 试图在实例烧毁后访问无主引用,会产生运行时错误(野指针)复制代码12.如何明确copy-on-write?

答:值范例(好比:struct),在复制时,复制对象与原对象实际上在内存中指向同一个对象,当且仅当修改复制的对象时,才会在内存中创建一个新的对象,为了提升性能,Struct, String、Array、Dictionary、Set接纳了Copy On Write的技术好比仅当有“写”操纵时,才会真正实验拷贝操纵对于标准库值范例的赋值操纵,Swift 能确保最佳性能,全部没须要为了包管最佳性能来克制赋值复制代码13.什么是属性观察?

答:属性观察是指在当前范例内对特性属性举行监测,并作出相应,属性观察是 swift 中的特性,具有2种, willset 和 didsetvar title: String {    willSet {        print("willSet", newValue)    }    didSet {        print("didSet", oldValue, title)    }}willSet会转达新值,默认叫newValuedidSet会转达旧值,默认叫oldValue在初始化器中设置属性值不会触发willSet和didSet复制代码14.swift 为什么将 String,Array,Dictionary操持为值范例?

答:值范例和引用范例相比,最大上风可以高效的利用内存,值范例在栈上操纵,引用范例在堆上操纵,栈上操纵仅仅是单个指针的移动,而堆上操纵扳连到归并,位移,重链接,Swift 如许操持淘汰了堆上内存分配和接纳次数,利用 copy-on-write将值转达与复制开销降到最低复制代码15..如何将Swift 中的协议(protocol)中的部门方法操持为可选(optional)?

答:1.在协议和方法前面添加 @objc,然后在方法前面添加 optional关键字,改方式实际上是将协议转为了OC的方式@objc protocol someProtocol {  @objc  optional func test()}2.利用扩展(extension),来规定可选方法,在 swift 中,协议扩展可以界说部门方法的默认实现protocol someProtocol {    func test()}extension someProtocol{    func test() {        print("test")    }}复制代码16.比力Swift 和OC中的初始化方法 (init) 有什么差别?

答:swift 的初始化方法,更加严格和精确, swift初始化方法需要包管全部的非optional的成员变量都完成初始化, 同时 swfit 新增了convenience和 required两个修饰初始化器的关键字convenience只提供一种方便的初始化器,必须通过一个指定初始化器来完成初始化required是欺压子类重写父类中所修饰的初始化方法复制代码17.比力 Swift和OC中的 protocol 有什么差别?

答:Swift 和OC中的 protocol类似点在于: 两者都可以被用作署理;差别点: Swift中的 protocol还可以对接口举行抽象,可以实现面向协议,从而大大进步编程服从,Swift中的protocol可以用于值范例,结构体,摆列;复制代码18.swift 和OC 中的自省 有什么区别?

答:自省在OC中就是判定某一对象是否属于某一个类的操纵,有以下2中方式[obj iskinOfClass:[SomeClass class]][obj isMemberOfClass:[SomeClass class]]在 Swift 中由于很多 class 并非继续自 NSObject, 故而 Swift 利用 is 来判定是否属于某一范例, is 不但可以作用于class, 照旧作用于enum和struct复制代码19.什么是函数重载? swift 支不支持函数重载?

答:函数重载是指: 函数名称类似,函数的参数个数差别, 大概参数范例差别,或参数标签差别, 返回值范例与函数重载无关swift 支持函数重载复制代码20.swift 中的摆列,关联值 和 原始值的区分?

答:1.关联值--偶然会将摆列的成员值跟其他范例的变量关联存储在一起,会非常有用// 关联值enum Date {  case digit(year: Int, month: Int, day: Int)  case string(String)}2.原始值--摆列成员可以利用类似范例的默认值预先关联,这个默认值叫做:原始值// 原始值enum Grade: String {  case perfect = "A"  case great = "B"  case good = "C"  case bad = "D"}复制代码21.swift 中的闭包结构是什么样子的?什么是尾随闭包?什么是逃逸闭包?什么是主动闭包?

答:1.{    (参数列表) -> 返回值范例 in 函数体代码}复制代码答:2.将一个很长的闭包表达式作为函数的末了一个实参  利用尾随闭包可以增强函数的可读性  尾随闭包是一个被誊写在函数调用括号表面(背面)的闭包表达式// fn 就是一个尾随闭包参数func exec(v1: Int, v2: Int, fn: (Int, Int) -> Int) {    print(fn(v1, v2))}// 调用exec(v1: 10, v2: 20) {    $0 + $1}复制代码答:3.当闭包作为一个实际参数转达给一个函数大概变量的时间,我们就说这个闭包逃逸了,可以在情势参数前写 @escaping 来明确闭包是允许逃逸的。非逃逸闭包、逃逸闭包,一般都是当做参数转达给函数非逃逸闭包:闭包调用发生在函数竣事前,闭包调用在函数作用域内逃逸闭包:闭包有大概在函数竣过后调用,闭包调用逃离了函数的作用域,需要通过@escaping声明// 界说一个数组用于存储闭包范例var completionHandlers: [() -> Void] = []//  在方法中将闭包当做实际参数,存储到外部变量中func someFunctionWithEscapingClosure(completionHandler: @escaping () -> Void) {    completionHandlers.append(completionHandler)}复制代码答:4.主动闭包是一种主动创建的用来把作为实际参数转达给函数的表达式打包的闭包。它不担当任何实际参数,并且当它被调用时,它会返回内部打包的表达式的值。这个语法的利益在于通过写平凡表达式取代显式闭包而使你省略困绕函数情势参数的括号。func getFirstPositive(_ v1: Int, _ v2: @autoclosure () -> Int) -> Int? {    return v1 > 0 ? v1 : v2()}getFirstPositive(10, 20)为了克制与盼望辩论,利用了@autoclosure的地方最好明确表明清楚:这个值会被推迟实验@autoclosure 会主动将 20 封装成闭包 { 20 }@autoclosure 只支持 () -> T 格式的参数@autoclosure 并非只支持末了1个参数有@autoclosure、无@autoclosure,构成了函数重载如果你想要主动闭包允许逃逸,就同时利用 @autoclosure 和 @escaping 标记。复制代码22. swift中, 存储属性和盘算属性的区别?

答:Swift中跟实例对象干系的属性可以分为2大类存储属性(Stored Property)类似于成员变量这个概念存储在实例对象的内存中结构体、类可以界说存储属性摆列不可以界说存储属性盘算属性(Computed Property)本质就是方法(函数)不占用实例对象的内存摆列、结构体、类都可以界说盘算属性struct Circle {    // 存储属性    var radius: Double    // 盘算属性    var diameter: Double {        set {            radius = newValue / 2        }        get {            return radius * 2        }    }}复制代码23.什么是耽误存储属性(Lazy Stored Property)?

答:利用lazy可以界说一个耽误存储属性,在第一次用到属性的时间才会举行初始化(类似OC中的懒加载)lazy属性必须是var,不能是let let必须在实例对象的初始化方法完成之前就拥有值如果多条线程同时第一次访问lazy属性 无法包管属性只被初始化1次 class PhotoView {    // 耽误存储属性    lazy var image: Image = {        let url = "https://...x.png"                let data = Data(url: url)        return Image(data: data)    }() } 复制代码24.swift 中如何利用单例模式?

答:可以通过范例属性+let+private 来写单例; 代码如下如下: public class FileManager {    public static let shared = {        // ....        // ....        return FileManager()}()    private init() { }}复制代码25.swift 中的下标是什么?

答:利用subscript可以给恣意范例(摆列、结构体、类)增长下标功能,有些地方也翻译为:下标脚本subscript的语法类似于实例方法、盘算属性,本质就是方法(函数)利用如下:class Point {    var x = 0.0, y = 0.0    subscript(index: Int) -> Double {        set {            if index == 0 {                x = newValue            } else if index == 1 {                y = newValue }        }        get {            if index == 0 {                return x            } else if index == 1 {                return y            }            return 0        }    }}var p = Point()// 下标赋值p[0] = 11.1p[1] = 22.2// 下标访问print(p.x) // 11.1print(p.y) // 22.2复制代码26.扼要阐明Swift中的初始化器?

答:类、结构体、摆列都可以界说初始化器类有2种初始化器: 指定初始化器(designated initializer)、便捷初始化器(convenience initializer)// 指定初始化器 init(parameters) {    statements }// 便捷初始化器convenience init(parameters) {    statements } 规则:每个类至少有一个指定初始化器,指定初始化器是类的重要初始化器默认初始化器总是类的指定初始化器类方向于少量指定初始化器,一个类通常只有一个指定初始化器初始化器的相互调用规则指定初始化器必须从它的直系父类调用指定初始化器便捷初始化器必须从类似的类里调用另一个初始化器便捷初始化器终极必须调用一个指定初始化器复制代码27.什么可选链?

答:可选链是一个调用和查询可选属性、方法和下标的过程,它大概为 nil 。如果可选项包罗值,属性、方法大概下标的调用乐成;如果可选项是 nil ,属性、方法大概下标的调用会返回 nil 。多个查询可以链接在一起,如果链中任何一个节点是 nil ,那么整个链就会得体地失败。多个?可以链接在一起如果链中任何一个节点是nil,那么整个链就会调用失败复制代码28.什么是运算符重载(Operator Overload)?

答:类、结构体、摆列可以为现有的运算符提供自界说的实现,这个操纵叫做:运算符重载struct Point {    var x: Int    var y: Int    // 重载运算符    static func + (p1: Point, p2: Point) -> Point   {        return Point(x: p1.x + p2.x, y: p1.y + p2.y)    }}var p1 = Point(x: 10, y: 10)var p2 = Point(x: 20, y: 20)var p3 = p1 + p2复制代码参考资料

iOS学习条记
iOS口试题整理
Swift 教程
iOS | 口试知识整理
总结

现在口试行情还行,要求底层这块较多,实在偶然候口试问的标题大概我们对于底层知知趣识的很少,但是代码当中却用到很多,我就是这一类的范例,口试的时间非常尴尬啊~,也怪自己平常都是已项目为主导,很多都是会用,却缺少肯定的自我总结,导致口试的时间说不出什么来。
您需要登录后才可以回帖 登录 | 立即注册

Powered by CangBaoKu v1.0 小黑屋藏宝库It社区( 冀ICP备14008649号 )

GMT+8, 2025-2-23 00:17, Processed in 0.259966 second(s), 32 queries.© 2003-2025 cbk Team.

快速回复 返回顶部 返回列表