2022-09-23爱回收

2022-11-23  本文已影响0人  浪呀么浪打浪

一面

【1、class与static修饰类的 时候】

static修饰存储属性、计算属性、类型方法,且修饰的方法不能被继承

class修饰计算属性、类方法,修饰的方法可以继承

final修饰的类、方法、变量是不能被继承或重写的,且通过它可以显示的指定函数的派发机制

在protocol中使用static来修饰类型域上的方法或者计算属性,因为struct、enum、class都支持static,而struct和enum不支持class

【2、defer什么时候调用?多个defer呢?】

defer语句:用来定义任何方式(抛错误、return等)离开代码块前必须要执行的代码

defer语句将延迟至当前作用域结束之前执行

defer语句的执行顺序与定义顺序相反

【3、map、flatmap、com pactmap】

map函数:map映射,将一个元素根据某个函数 映射 成另一个元素(可以是同类型,也可以是不同类型)。map 方法获取一个闭包表达式作为其唯一参数。 数组中的每一个元素调用一次该闭包函数,并返回该元素所映射的值。简单说就是数组中每个元素通过某个方法进行转换,最后返回一个新的数组。

flatMap函数:flatMap 方法同 map 方法比较类似,只不过它返回后的数组中不存在 nil(自动把 nil 给剔除掉),同时它会把 Optional 解包。flatmap可以将元素映射成可选类型。

filter 过滤,将一个元素传入闭包中,如果返回的是false , 就过滤掉

reduce先映射后融合,将数组中的所有元素映射融合在一起

【4、throw 和rethrows】

【5、runloop与线程?如何添加常驻线程】

【6、afn,最大并发数为什么是1】

最大并发数是1 的优点:

1),所有的网络请求和网络相应都在同一个线程,不是每个请求都新建一个线程,节约资源。

2),并发数是1,能够保证处理请求的正确顺序。

一 常驻线程:

1、2.0 需要常驻线程的作用?

2.0常驻线程,用来并发请求,和处理数据回调;避免多个网络请求的线程开销(不用开辟一个线程,就保活一条线程);

2、而3.0不需要常驻线程?

因为NSURLSession可以指定回调delegateQueue,NSURLConnection而不行;

NSURLConnection的一大痛点就是:发起请求后,而需要一直处于等待回调的状态。而3.0后NSURLSession解决的这个问题;NSURLSession发起的请求,不再需要在当前线程进行回调,可以指定回调的delegateQueue,这样就不用为了等待代理回调方法而保活线程了。

二 最大并发数:

1 、3.0需要设置最大并发数为1,self.operationQueue.maxConcurrentOperationCount = 1?

串行:让并发的请求,串行的进行回调;

锁:且为了防止多线程资源竞争加了锁(对 self.mutableTaskDelegatesKeyedByTaskIdentifier(多任务代理) 的访问进行了加锁),本来就需要等待,如果多线程并发反而造成资源浪费;

2、2.0为什么不需要?

功能不一样:AF3.0的operationQueue是用来接收NSURLSessionDelegate回调的,鉴于一些多线程数据访问的安全性考虑,设置了maxConcurrentOperationCount = 1来达到串行回调的效果。

而AF2.0的operationQueue是用来添加operation并进行并发请求的,所以不要设置为1。

【7、组件化命令pod spec lint 与pod lib lint】

pod lib lint:进行私有库本地验证

 pod spec lint:进行私有库远端验证

【8、podfile 中user_framework有什么用】

【9、动态库与静态库的区别?】

https://www.jianshu.com/p/4301a6f3e426

静态库:(静态链接库)(.a)在编译时会将库copy一份到目标程序中,编译完成之后,目标程序不依赖外部的库,也可以运行 缺点:会使应用程序变大。动态库:(.dylib)编译时只存储了指向动态库的引用。可以多个程序指向这个库,在运行时才加载,不会使应用体积变大,但是运行时加载会损耗部分性能,并且依赖外部的环境,如果库不存在或者版本不正确则无法运行Framework:实际上是一种打包方式,将库的二进制文件,头文件和有关的资源文件打包到一起,方便管理和分发。

use_frameworks!

1、用cocoapods 导入swift 框架 到 swift项目和OC项目都必须要 use_frameworks!

2、使用 dynamic frameworks,必须要在Podfile文件中添加 use_frameworks!

(1)如果在Podfile文件里 *不使用* use_frameworks! 则是会生成相应的 .a文件(静态链接库),通过 static libraries 这个方式来管理pod的代码。

(2)Linked:libPods-xxx.a包含了其它用pod导入的第三方框架的.a文件。

(3)如果使用了use_frameworks! 则cocoapods 会生成相应的 .frameworks文件(动态链接库:实际内容为 Header + 动态链接库 + 资源文件),使用 dynamic frameworks 来取代 static libraries 方式。(4)Linked:Pods_xxx.framework包含了其它用pod导入的第三方框架的.framework文件。

【10、UIView与clayer区别?clayer树的层级有哪些】

1).UIView 是 iOS 系统中界面元素的基础,所有的界面元素都是继承自它。它本身完全是由 CoreAnimation 来实现的。它真正的绘图部分,是由一个 CALayer 类来管理。 UIView 本身更像是一个 CALayer 的管理器,访问它的跟绘图和跟坐标有关的属性。

2).UIView 有个重要属性 layer ,可以返回它的主 CALayer 实例。

3).UIView 的 CALayer 类似 UIView 的子 View 树形结构,也可以向它的 layer 上添加子layer ,来完成某些特殊的表示。即 CALayer 层是可以嵌套的。

4).UIView 的 layer 树形在系统内部,被维护着三份 copy 。分别是逻辑树,这里是代码可以操纵的;动画树,是一个中间层,系统就在这一层上更改属性,进行各种渲染操作;显示树,其内容就是当前正被显示在屏幕上得内容。

5).动画的运作:对 UIView 的 subLayer (非主 Layer )属性进行更改,系统将自动进行动画生成,动画持续时间的缺省值似乎是 0.5 秒。

6).坐标系统: CALayer 的坐标系统比 UIView 多了一个 anchorPoint 属性,使用CGPoint 结构表示,值域是 0~1 ,是个比例值。这个点是各种图形变换的坐标原点,同时会更改 layer 的 position 的位置,它的缺省值是 {0.5,0.5} ,即在 layer 的中央。

7).渲染:当更新层,改变不能立即显示在屏幕上。当所有的层都准备好时,可以调用setNeedsDisplay 方法来重绘显示。

8).变换:要在一个层中添加一个 3D 或仿射变换,可以分别设置层的 transform 或affineTransform 属性。

9).变形: Quartz Core 的渲染能力,使二维图像可以被自由操纵,就好像是三维的。图像可以在一个三维坐标系中以任意角度被旋转,缩放和倾斜。 CATransform3D 的一套方法提供了一些魔术般的变换效果。

【realm、fmdb、coredata区别?为什么选择realm,优缺点】

realm:

FMDB:

(coredata)

【沙盒机制】

持久化在Document目录下,一般存储非机密数据。当App中涉及到电子书阅读、听音乐、看视频、刷图片列表等时,推荐使用沙盒存储。因为这可以极大的节约用户流量,而且也增强了app的体验效果.

Application:存放程序源文件,上架前经过数字签名,上架后不可修改

Documents: 保存应运行时生成的需要持久化的数据,iTunes同步设备时会备份该目录。例如,游戏应用可将游戏存档保存在该目录。

tmp: 保存应运行时所需的临时数据,使⽤完毕后再将相应的文件从该目录删除。应用没有运行时,系统也可能会清除该目录下的文件。iTunes同步设备时不会备份该目录

Library/Caches: 保存应用运行时生成的需要持久化的数据,iTunes同步设备时不会备份该目录。一般存储体积大、不需要备份的非重要数据,比如网络数据缓存存储到Caches下。

Library/Preference: 保存应用的所有偏好设置,如iOS的Settings(设置) 应会在该目录中查找应⽤的设置信息。iTunes同步设备时会备份该目录

【swift的映射机制】

反射:是指可以动态获取类型、成员信息,在运行时可以调用方法、属性等行为的特性。

我们已经知道,对于一个纯swift类来说,并不支持直接像OC runtime那样的操作;但是swift标准库依旧提供了反射机制,用来访问成员信息,即Mirror。

上一篇下一篇

猜你喜欢

热点阅读