Block 用法
声明
Block:是管理程序中代码块的对象
1.block的声明和实现1
2
3int(^block1)(int,int) = ^(int a,int b){
return a + b;
};
可拆分为:1
2
3
4
5int(^block2)(int,int);
block2 = ^(int a,int b){
return a + b;
};
block2(1,2);
2.block的执行部分:1
int sum = block1(1,2);
【注】block的调用 Block的声明的和实现都不执行代码,只有调用才会执行
3.系统中的block (数组的遍历)1
2
3
4
5
6
7
8
9
10
11
12NSArray * arr = @[@"one",@"two"];
[arr enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop){
//obj是元素
//idx是索引
//*stop是是否停止循环
if ([obj isEqualToString:@"one"]) {
*stop = YES;
}
NSLog(@"%@ %ld",obj,idx);
//至少会循环一次
}];
作为 property
block 修饰一般用 copy
1
@property (nonatomic,copy) void(^block)(NSMutableArray *);
代码块1
2
3_block = ^(void)(NSMutableArray *arr){ // (void) 可省略
//...
}
typedef 形式1
2
3
4typedef int (^MyBlock)(int a, int b);
MyBlock myBlock = ^int (int a, int b) {
return a * b;
};
在方法形式
- (void)method:(void(^)(int i, int ii))blockName;
修改代码块中的变量需要用 __block
修饰。
内存
存储区域:全局、栈、堆
使用的是堆上代码,实际存储位置为栈区
线程
可以同步执行,也可以异步执行;1
2
3
4//同步执行
[self.dataSourceArr enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
}];
1 | // 异步执行 |