1.block是一个匿名函数代码块
(1)block声明的时候,就是传值的时候,代码块并没有被运行.
(2)在block回调的时候代码块才被执行.
‘^’托字符 返回值类型(可省略) (参数列表) {表达式}
//1.无参数无返回值的block
^(void){ NSLog(@"--------**^((");}
//2.有参数有返回值的block
^(int a){ return a+1;}
//1.无参数无返回值的block
void (^myBLock1)(void);
//对Blcok类型变量的赋值
myBLock1 = ^(void){
NSLog(@"--------**^((");
};
// block回调
myBLock1();
//2.有参数有返回值的block
int (^sumBlock)(int, int) = ^(int a, int b){
return a + b;
};
NSLog(@"%d", sumBlock(10, 20));
使用typedef对block类型进行重命名(参数类型和返回值类型,以及有无参数,有无返回值,都会造成block类型)
typedef int (^MathBlock)(int, int);
MathBlock sumBlock;
sumBlcok = ^(int a,int b){return a +b ;};
block里的代码块修改block外面的变量,需要加上关键字__block,这个值在外面访问也是访问到已经被改变的值
int main(int argc, const char * argv[]) {
@autoreleasepool {
typedef float (^MyBlock) (float, float);
MyBlock multiBlock;
// block外面定义变量
__block int c = 10;
multiBlock = ^(float a, float b){
c--;
NSLog(@"c = %d", c);
return a * b;
};
NSLog(@"c = %d", c);
float result = multiBlock(2.5, 3.0);
NSLog(@"result = %f", result);
NSLog(@"c = %d", c);
/*打印结果为:c = 10
c = 9
c = 9
*/
// block遍历数组
NSArray *array = @[@"hello", @"world", @"!!!"];
[array enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
if(idx == 1) {
*stop = YES;
}
NSLog(@"%lu %@", idx, obj);
}];
// block遍历字典
NSDictionary *dic = @{
@"key" : @"value",
@"name" : @"salary",
@"menpai" : @"wudan"
};
[dic enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
NSLog(@"key:%@ value:%@", key, obj);
}];
}
return 0;
}
事件:小孩变脏,需要保姆照顾
回顾代理设计模式:
(1)产生事件的对象:小孩
(2)响应事件的对象:保姆
(3)保姆签协议:实现方法
(4)小孩要设置代理对象
block实现对象间通信要点
(1)产生事件的对象:一,要有block属性 二,谁产生事件谁回调block
(2)响应事件的对象:谁响应事件谁传递block
关键代码:
(1)在产生事件的对象中定义Block属性
typedef void(^HandleChildBlock)(Child *);
@property(nonatomic, assign) NSInteger cleanValue;
// block的内存管理方式用copy
@property(nonatomic, copy) HandleChildBlock washBlock;
(2)在影响事件的对象中给Block赋值
- (void)washChild:(Child *)child {
// 功能是把小孩的清洁值变为100
child.washBlock = ^(Child *ch){
NSLog(@"保姆给小孩洗白白");
ch.cleanValue = 100;
};
(3)在产生事件的对象中回调Block
if(self.washBlock){
_washBlock(self);
}