美文网首页
2019-11-21iOS高级工程师面试

2019-11-21iOS高级工程师面试

作者: 飞哥漂流记 | 来源:发表于2019-11-29 19:11 被阅读0次

1. blcok相关知识?

在ARC环境下,编译器会根据情况自动将栈上的block进行一次copy操作,将block复制到堆上。

//block拷贝到堆上的几种情况:

    1.调用block的copy实例方法

    2.Block作为函数返回值

    3.将block赋值给有__strong修饰符的id类型的类或block类型成员变量时

    4.在方法名中含有usingBlock的cocoa框架方法或GCD的API传递blokc时<code>

我们使用block有两种方式,逃逸和非逃逸(借用swift中的说法)

非逃逸:声明的block的生命周期就是声明所在的函数体的生命周期。我们在函数体中声明一个block,这个block会在函数体结束时释放。

逃逸:声明的block生命周期和声明所在的函数体无关了。我们在函数A中声明的block,在B中也可以调用。

1.NSGlobalBlock (不捕获自动变量的类型或者捕获的是静态局部变量)

此处指的不捕获自动变量,变量不包含全局变量,因为全局变量的特殊生命周期,不需要捕获,也可以在block中访问。

1.值捕获:捕获的变量为其指针指向的值,或基础数据类型的值

指针指向的值:

2.地址捕获:捕获的变量为其指针本身,或指向基础数据类型的指针

4.解决循环引用,打破block对对象的强引用即可,两种方式:__weak对象,__block对象(需在block内将变量主动置空)

对于 MRC 环境,使用 Copy 修饰 Block,会将栈区的 Block 拷贝到堆区。

对于 ARC 环境,使用 Strong、Copy 修饰 Block,都会将栈区的 Block 拷贝到堆区。

所以,Block 不是一定要用 Copy 来修饰的,在 ARC 环境下面 Strong 和 Copy 修饰效果是一样的。

补充:一个block要使用self,会处理成在外部声明一个weak变量指向self,然而为何有时会出现在block里又声明一个strong变量指向weakSelf?

原因:block会把写在block里的变量copy一份,如果直接在block里使用self,(self对变量默认是强引用)self对block持有,block对self持有,导致循环引用,所以这里需要声明一个弱引用weakSelf,让block引用weakSelf,打破循环引用。

而这样会导致另外一个问题,因为weakSelf是对self的弱引用,如果这个时候控制器pop或者其他的方式引用计数为0,就会释放,如果这个block是异步调用而且调用的时候self已经释放了,这个时候weakSelf已就变成了nil。

当控制器(也可以是其他的控件)pop回来之后(或者一些其他的原因导致释放),网络请求完成,如果这个时候需要控制器做出反映,需要strongSelf再对weakSelf强引用一下。

但是,你可能会疑问,strongSelf对weakSelf强引用,weakSelf对self弱引用,最终不也是对self进行了强引用,会导致循环引用吗。不会的,因为strongSelf是在block里面声明的一个指针,当block执行完毕后,strongSelf会释放,这个时候将不再强引用weakSelf,所以self会正确的释放。

2.单层深copy?

对于不可变的容器类对象(如NSArray、NSSet、NSDictionary)进 mutableCopy 操作,内存地址发生了变化,但是其中的元素内存地址并没有发生变化,属于单层深拷贝。

3.隐式动画和显式动画的区别?

显式动画是指用户自己通过beginAnimations:context:和commitAnimations创建的动画。

隐式动画是指通过UIView的animateWithDuration:animations:方法创建的动画。

隐式动画一直存在 如需关闭需设置;显式动画是不存在,如需显式 要开启(创建)。

隐式动画是系统框架自动完成的。Core Animation在每个runloop周期中自动开始一次新的事务,即使你不显式的用[CATransaction begin]开始一次事务,任何在一次runloop循环中属性的改变都会被集中起来,然后做一次0.25秒的动画。在iOS4中,苹果对UIView添加了一种基于block的动画方法:+animateWithDuration:animations:。这样写对做一堆的属性动画在语法上会更加简单,但实质上它们都是在做同样的事情。CATransaction的+begin和+commit方法在+animateWithDuration:animations:内部自动调用,这样block中所有属性的改变都会被事务所包含

4. 自动释放池的相关知识?

相关文章

网友评论

      本文标题:2019-11-21iOS高级工程师面试

      本文链接:https://www.haomeiwen.com/subject/jjxzictx.html