iOS面试题-block

block的内存管理

无论当前环境是ARC还是MRC,只要block没有访问外部变量,block始终在全局区

MRC情况下:

    block如果访问外部变量,block在栈里

    不能对block使用retain,否则不能保存在堆里

    只有使用copy才能放到堆里

ARC情况下:

    block如果访问外部变量,block在堆里

    block可以使用copy和strong,并且block是一个对象

block循环引用

如果要在block中直接使用外部强指针会发生错误,使用以下代码在block外部实现可用解决

__weak typeof(self) weakSelf = self;

但是如果在block内部使用延时操作还使用弱指针的话会取不到该弱指针,需要在block内部再将弱指针强引用一下

__strong typeof(self) strongSelf = weakSelf;

block的变量传递

如果block访问的外部变量是局部变量,那么就是值传递,外界改了,不会影响里面

如果block访问的外部变量是__block或者static修饰,或者是全局变量,那么就是指针传递,block里面的值和外界同一个变量,外界改变,里面也会改变

使用NSTimer写出一个使用block显示(在UILabel上)秒表的代码

NSTimer *timer = [NSTimer scheduledTimerWithTimeInterval:1.0 repeats:YES callback:^() {

    weakSelf.secondsLabel.text = ...

}];

[[NSRunLoop currentRunLoop] addTimer:timer forMode:NSRunLoopCommonModes];

使用block和使用delegate实现委托模式有什么优点?

使用block实现委托模式,其优点是回调的block代码块定义在委托对象函数内部,使代码更为紧凑

适配对象不再需要实现具体某个protocol,代码更为简洁

你可能感兴趣的:(iOS面试题-block)