- block的变量传递
如下例子分别声明一个局部变量、一个__block修饰的局部变量、一个静态变量和一个全局变量,并且初始的值为1,在block中打印外部的值,而且在该block过去之后改变前面声明的变量值。如下:
@implementation ViewController
int param = 4;
- (void)viewDidLoad {
[super viewDidLoad];
int param1 = 1;
static int param2 = 1;
__block int param3 = 1;
_block = ^{
NSLog(@"%s----%d-%d-%d-%d",__func__,param, param1,param2,param3);
};
param = 2;
param1 = 2;
param2 = 2;
param3 = 2;
_block();
}
-[ViewController viewDidLoad]_block_invoke----2-1-2-2
打印日志如下,除了局部变量是1外其他都是2,在block中除了局部变量是传递外,其他的都是指针传递。
- MRC中没有强指针和弱指针的概念,所有属性都是基本数据类型,基本数据类型都放在栈里面
在block内部使用外部指针且会造成循环引用情况下,需要用weak修饰外部指针 weak typeof(self) weakSelf = self;
如例子block造成循环引用:Block会对其块里面的所有外部强指针变量变量全部引用一次。
#import "modelViewController.h"
@interface modelViewController ()
@property (nonatomic,strong) void(^block)();
@end
@implementation modelViewController
- (void)viewDidLoad {
[super viewDidLoad];
int param = 1;
_block = ^{
NSLog(@"%@", self);
};
param = 2;
}
问问
- 在block内部如果调用了延时函数还使用弱指针会取不到该指针,因为已经被销毁了,需要在block内部再将弱指针重新强引用一下__strong typeof(self) strongSelf = weakSelf;如一下代码:
__weak typeof(self) weakSelf = self;
dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(5 *
NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
NSLog(@"%@", weakSelf);
});
- 如果需要在block内部改变外部变量的话,需要在用__block修饰外部变量
int param = 1;
void goToWork(WorkBlock workBlock)
{
NSLog(@"%d", param);
}
//上面的结果是1
通过上面的block可以看出在block中访问外面的的变量是没有问题的,但是直接修改外面的变量的值是会报错的,如下param = 2;
会报错。
void goToWork(WorkBlock workBlock){
param = 2;
NSLog(@"%d", param);
}
所以在修改block外部变量的值之前需要在前面加__block;
待补充...