iOS-block开发中使用场景
一、最简单的block
1、最简单的block结构
^{ NSLog(@"this is a block"); NSLog(@"this is a block"); NSLog(@"this is a block"); };
2、block的调用
^{ NSLog(@"this is a block"); NSLog(@"this is a block"); NSLog(@"this is a block"); }();
void (^block)(void) = ^{ NSLog(@"this is a block"); NSLog(@"this is a block"); NSLog(@"this is a block"); }; block();
二、block 开发中使用场景
1.定义、赋值、调用
/* block要掌握的东西 (定义 赋值 调用) 1> 如何定义block变量 int (^sumBlock)(int, int); void (^myBlock)(); 2> (给block 赋值)如何利用block封装代码 ^(int a, int b) { return a - b; }; ^() { NSLog(@"----------"); }; ^ { NSLog(@"----------"); }; 3> block访问外面变量 * block内部可以访问外面的变量 * 默认情况下,block内部不能修改外面的局部变量 * 给局部变量加上__block关键字,这个局部变量就可以在block内部修改 * block访问全局变量时直接访问不会引用 4> 利用typedef定义block类型 typedef int (^MyBlock)(int, int); // 以后就可以利用MyBlock这种类型来定义block变量 MyBlock block; MyBlock b1, b2; b1 = ^(int a, int b) { return a - b; }; MyBlock b3 = ^(int a, int b) { return a - b; }; */
1.开发中的应用
block开发中使用场景
- 把block保存到对象中,恰当时机的时候才去调用
- 把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定.
- 把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用
ViewController.m 中用到了Person类
ViewController.m
#import "ViewController.h" #import "Person.h" @interface ViewController () @property (nonatomic, strong) Person *p; @end @implementation ViewController - (void)viewDidLoad { [super viewDidLoad]; // block开发中使用场景 // 1.把block保存到对象中,恰当时机的时候才去调用 // 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定. // 3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用 } // block作用:帮你保存一份代码,等到恰当时机的时候才去调用 - (void)block { // block声明,定义 //快捷键 inlineBlock // <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) { // <#statements#> // }; void(^block)() = ^() { // 保存什么样的代码 NSLog(@"执行block"); }; // 调用block block(); } //1.把block保存到对象中,恰当时机的时候才去调用 - (void)block1 { Person *p = [[Person alloc] init]; //第一种1.赋值 void(^block)() = ^() { NSLog(@"执行对象中block"); }; p.operation = block; //第一种2.赋值 p.operation = ^(){ NSLog(@"执行对象中block"); }; _p = p; } - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event { //调用 1 _p.operation(); } // 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给 外界决定. - (void)block2 { Person *p = [[Person alloc] init]; //第一种1.传参 void(^block)() = ^{ NSLog(@"吃东西"); }; [p eat:block]; //第一种2.传参值 // 传入block给参数的Block赋值 [p eat:^{ NSLog(@"吃东西"); }]; } //3.把block当做方法的返回值,目的就是为了代替方法.,block交给 内部实现 ,外界不需要知道Block怎么实现,只管调用 - (void)block3 { //目的就是为了代替方法 功能一样 写法不一样 Person *p = [[Person alloc] init]; //方法run [p run:2]; //block作为返回值 为什么能够用点调用呢p.run 进去看解释 p.run(2); //p.run返回值是block 相当于 block, block()语法是通的 所以 p.run(2)语法是对的相当于给block传一个参数int2 //代码解释上面的现象 void(^run)() = p.run; //p.run返回值是block 用block接受 run(2); //调用block } @end
定义一个 Person.h
#import <Foundation/Foundation.h> // name:类型的别名 typedef void(^BlockName)(); typedef void(^operation)(); @interface Person : NSObject // block:ARC使用strong,非ARC使用copy // block类型:void(^)() //1.把block保存到对象中,恰当时机的时候才去调用 @property (nonatomic, strong) void(^operation)(); //@property (nonatomic,strong) operation operation; // 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定. // 参数类型:block类型 - (void)eat:(void(^)())block; //- (void)eat:(BlockName)block; //3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用 //功能一样写法不一样 //方法这样写 - (void)run:(int)metre; //把block当做方法的返回值 - (void(^)(int))run; @end
Person.m
#import "Person.h" @implementation Person /** * 2.把block当做方法的参数使用,外界不调用,都是方法内部去调用,Block实现交给外界决定. * @param block 代码块传过来 */ - (void)eat:(void (^)())block { /** block = ^{ NSLog(@"吃东西"); }; */ //调用 block(); } //3.把block当做方法的返回值,目的就是为了代替方法.,block交给内部实现,外界不需要知道Block怎么实现,只管调用 //方法 - (void)run:(int)metre { NSLog(@"%d",metre); } //把block当做方法的返回值 相当于一个get方法 (点语法是一个编译器的特性 如果给属性提供了getter和setter方法, 那么就可以通过点语法来访问属性) - (void (^)(int))run { return ^(int meter){ NSLog(@"跑了%d米",meter); }; } @end