likes
comments
collection
share

iOS 面试题(五)

作者站长头像
站长
· 阅读数 48

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
评论
请登录