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,代码更为简洁
网友评论