文章目录
  1. 1. 声明
  2. 2. 内存
  3. 3. 线程
  4. 4. 参考资料

声明


Block:是管理程序中代码块的对象

1.block的声明和实现

1
2
3
int(^block1)(int,int) = ^(int a,int b){
return a + b;
};

可拆分为:

1
2
3
4
5
int(^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
12
NSArray * 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
4
typedef 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
2
3
4
// 异步执行
dispatch_async(dispatch_get_main_queue(), ^{

});

参考资料


0、Block的使用
1、iOS-Block的使用你看我啊
2、iOS中block块的存储位置&内存管理

文章目录
  1. 1. 声明
  2. 2. 内存
  3. 3. 线程
  4. 4. 参考资料