iOS 面试题(五)
Swift 闭包是什么类型
-
值类型-每个实例都拥有其数据的一份副本。当被赋值给一个变量或常量,或传递给一个函数时候,它会建立一份新的副本。
-
引用类型—所有实例共享一个数据副本。当被赋值给一个变量或常量,或传递给一个函数时候,一个引用类型一旦被初始化,会返回一个指向已存在实例的引用。
-
除了 class 和闭包都是值类型
coreAnimation 后 为什么layer 会恢复
- 因为产生的动画都是假象,实质上并没有对layer进行改变,这里需要说一下图层树里的呈现树,呈现树实际上是模型树的复制,它的属性值决定了当前的显示效果,动画的过程实际上只是修改了呈现树,并没有改变图层的属性,所以在动画结束后会恢复到原来的状态。
追问 呈现树工作的时候 模型树是隐藏还是被移除或者覆盖
望各位带佬给我解答- 经大佬解答,modellayer(模型树)应该就是个数据模型,只放数据,presentationlayer(呈现树)才是外观真正的展示,类似于 MVC 的 Model 和 View,一个负责数据,一个展示,在动画过程中,不存在什么隐藏或移除(我在动画过程中用定时器里打印了一下,modellayer 一直在而且透明度和 ishidden 都正常)
Array 的设计 怎么申请内存分配
- __NSArrayM 用了环形缓冲区 (circular buffer)。这个数据结构相当简单,只是比常规数组或缓冲区复杂点。环形缓冲区的内容能在到达任意一端时绕向另一端。
- 环形缓冲区有一些非常酷的属性。尤其是,除非缓冲区满了,否则在任意一端插入或删除均不会要求移动任何内存。我们来分析这个类如何充分利用环形缓冲区来使得自身比 C 数组强大得多。在任意一端插入或者删除,只是修改offset参数,不需要移动内存,我们访问的时候只是不和普通的数组一样index多少就是多少,这里会计算加上offset之后处理的值取数据,而不是插入头和尾巴的时候,环形结构会根据最少移动内存指针的方式插入,例如要在A和B之间插入,按照C的数组,我们需要把B到E的元素移动内存,但是环形缓冲区的设计,我们只要把A的值向前移动一个单位内存,即可,同时修改offset偏移量,就能保证最小的移动单元来完成中间插入。
- 环形缓冲区的数据结构如果是连续数组结构,在扩容的时候难免会移动大量内存,因此用链表实现环形缓冲会更好
- CFArray 也就是不可变数组是由双端队列实现的
自己设计一个 UITableView 需要哪些数组
- 可见 cell 数组
- 缓存池数组
Swift 的闭包和 OC block 的区别
- block在实现的时候已经捕获了局部变量,而 Swift闭包则是调用的时候捕获局部变量
- Swift 闭包默认给自动变量加了__block,可以直接修改值
- Swift 的捕获列表也可以实现和 block 一样的捕获
var i = 1
let closure = {
[i] in
print("closure \(i)")
}
i += 1
print("out1 \(i)")
closure()
print("out 2 \(i)")
//打印结果 2 1 2
- Block 类型的并不能作为 返回值 也不可以 作为函数的返回值 。 在swift 中Closure 是可以的作为另一个闭包 也可以作为函数的返回值 。
- 在使用可选类型时,要明确闭包截获了可选类型还是实例变量。这样才能正确判断是否发生循环引用。
block 的生命周期
-
1,Block指针会在方法或函数结束后release掉,此时内存是储存在Stack里。
-
2,如果要在保存Block指针,需要用到copy方法(类似于NSObject),此时内存储存在Heap里。
-
3,Block函数体里的变量会被自动Retain,等Block结束掉后会Release。
-
4,__block 前缀标明的变量,不会自动Reatin。
-
5,在block里如果直接操作self,则self会自动retain。
-
6,在block里如果操作类变量,则变量所属的类会自动retain
避免https 中间人攻击
- MD5 验签?
- 传输不敏感数据?
- 客户端不安装伪造证书?
- 求各位带佬解答 搞不太懂
weak底层实现
- weak是Runtime维护了一个hash(哈希)表,用于存储指向某个对象的所有weak指针。weak表其实是一个hash(哈希)表,Key是所指对象的地址,Value是weak指针的地址(这个地址的值是所指对象指针的地址)数组。
转载自:https://juejin.cn/post/6911603323011825678