block定义详解
来源:互联网 发布:抗皱护肤品知乎 编辑:程序博客网 时间:2024/05/29 05:00
block 是一组代码块组成的特殊类型,在定义和作为参数时跟普通类型略有不同,
// block :块代码.指向结构体的指针.javascript/js:闭包.
// 闭包: 可以从函数外部访问函数内部的变量.
// block 很灵活. 可以将 block 当做一个参数传递. ===> 将一个方法当做参数传递了.
// block 使用:
// 1. 定义block类型. 返回值/参数类型.
// 2. 定义block中执行的内容. 确定block中执行的代码.
// 3. 执行block.
// 上面三步只要保证顺序就OK,具体哪一个步骤在哪一个对象中定义,不必关心.
block的定义:
void (^block)(int a,int b) =^(int a,int b){
NSLog(@"%d “,a+b);
};
void 是这个block返回值的类型,^这个符号专门代表block类型的,小括号内的(int a,int b)是参数列表,后面接的是定义后的直接赋值,^是固定写法,后面接上参数列表,再后面的大括号内写这个block具体包括的代码;
直接定义写法: 返回值类型 (^ block变量名)(参数列表);
block类型可以直接作为函数的参数或者函数的返回值:
一般比较常见的写法是typedef void (^block) ();
这样通过起别名的方式把较为繁琐的block类型直接改为block,此时,定义一个变量名为bb的无参数无返回值的block类型就可以直接写:block bb; 其他有参数及有返回值的block均可以通过这种方式来起别名,这样起别名的好处是可以直接用于函数或是方法中传入block类型;
例如:
typedef void(^ BlockType) ();
@interface Person :NSObject
@property BlockType bb;
@prtoperty int a;
@end
这里可以参照 下面的int型来做参考理解,
下面给新手讲解两个特别难理解的写法:
typedef void(^ BlockType) ();
@interface Person :NSObject
(1) -(void)test :(void (^)()) myblock;
-(void)test :(void (^myblock)()) ;
-(void) test:(BlockType) myblock;
(2): @property void(^block)();
@prtoperty int a;
@end
其中 (1) 是一种特殊的写法,把myblock作为参数传入对象的方法test中,下面两个传统写法作参考
其中(2)是一种常见的定义对象属性的方式,对比下面的int 类型定义还是有特别区别,新手可以这样理解,int a 是前面是类型,后面是变量名,也就是说@property需要知道后面的是什么类型,然后是变量名是什么,而我们用 @property void(^block)();时,@property已经知道了这个是一个无参数无返回值类型的block,然后这个类型的变量名是block,所以这种写法是非常正统和正确的,当然也可以像上面的一样使用typedef起别名的方式来定义。
//下面就给出一个实例
A对象:需要执行一段代码,但是需要B对象的值
A对象要写的代码:(next为B对象,在A对象中能跟B对象进行交流的代码中写一句话,譬如在导航控制器的
-(void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
方法)next.block = ^(NextController * next){
self.label.text = next.textField.text;
};
//备注:如果在代码中的NextController * next不写齐的,系统无法去执行代码,
B对象要写的代码:
.h:
typedef void(^myblock)(NextController *);
@property(nonatomic,strong)myblock block;
.m
if (self.block) {
self.block(self);
}
0 0
- block定义详解
- 定义block
- block 定义
- block 定义
- Block详解
- block详解
- Block详解
- block详解
- Block详解
- block详解
- Block详解
- block详解
- Block 详解
- block详解
- block详解
- block详解
- BLock详解
- Block的定义
- Swift学习笔记
- lua开发--模板渲染
- 信号槽
- PHP动态创建属性的get和set方法
- 图片上传
- block定义详解
- poj 3259 Wormholes 图论 最短路 判负环
- 增强现实(AR)笔记2:Vuforia+Unity例程ObjectRecognition
- YUM 的配置
- Android各个版本API的区别
- 状态图
- UsernamePasswordAuthenticationFilter是登陆用户密码验证过滤器,
- 输入三个字符后,按各字符的ASCII码从小到大的顺序输出这三个字符。
- Android AsynTask 与Thread 或线程池 使用分析