iOS block
2015-09-25 21:00
429 查看
主要内容:
block基本声明格式
block访问区域变量
block代替代理
block基本声明格式:
注: Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
最简单的例子:
简单调用例子:
Block Pointer(Block指针)
Block 还可以当作方法传给参数,如:
存取变量:
在同一个代码块里面,Block是可以读取Block之外的变量的,如:
当变量为简单类型时,Block是直接copy当前变量的,而不是引用,如:
注:如果变量被static修饰过,会有一样的效果
当变量为指针时,如:
Block variable(Block类型变量)
在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。
那么在block里面就可以任意修改此变量的值,如:
用Block代替代理
假如controller 的名字为: MyUIViewController
1).声明一个block(假设无返回值)
2).在controller(事件触发源的地方)定义block
3).在对应的m文件里面实现setter方法
4)在controller 中使用block实现回调,如:
5)在其它地方,接收传过来的参数,如:
注: 如果需要在block 里面调用self,则需要用weak 修饰避免整个类循环copy.如: __weak typeof(self) wself = self;
block基本声明格式
block访问区域变量
block代替代理
block基本声明格式:
^(传入的参数){具体代码};
注: Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。
最简单的例子:
^(int a){return a*a};
简单调用例子:
int result = ^(int a){return a*a}(5); NSLog(@"%d", result); //好像这个例子没什么用,个人不知道这样写的意义在哪。
Block Pointer(Block指针)
//声明一个square的Block Pointer,其所指向的Block有一个int输入和int输出 int (^square)(int); //将Block实体指定给square square = ^(int a){ return a*a ; }; //调用方法,感觉是是不是很像function的用法? int result = square(5); NSLog(@"%d", result);
Block 还可以当作方法传给参数,如:
-(void)objcMethod:(int(^)(int))square; //square参数的类型是int(^)(int)
存取变量:
在同一个代码块里面,Block是可以读取Block之外的变量的,如:
{ int outN = 8; int (^myPtr)(int) = ^(int a){ return outN + a;}; //block里面可以读取同一类型的outN的值 int result = myPtr(3); // result is 11 NSLog(@"result=%d", result); }
当变量为简单类型时,Block是直接copy当前变量的,而不是引用,如:
{ int outN = 8; int (^myPtr)(int) = ^(int a){ return outN + a;}; //block里面可以读取同一类型的outN的值 //改变outN 的值 outN = 5; int result = myPtr(3); // result is 11 NSLog(@"result=%d", result); }
注:如果变量被static修饰过,会有一样的效果
当变量为指针时,如:
{ NSMutableString string = [[NSMutableString alloc]initWithString:@"aaaa"]; int (^myPtr)(int) = ^(int a){[string setString:@"changed!"] return a + a;}; //block里面可以读取同一类型的outN的值 int result = myPtr(3); // result is 11 NSLog(@"string =%@", string);// string =changed }
Block variable(Block类型变量)
在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。
那么在block里面就可以任意修改此变量的值,如:
{ int outN = 8; int (^myPtr)(int) = ^(int a){ return outN+= a;}; //block里面可以读取同一类型的outN的值 int result = myPtr(3); // result is 11 NSLog(@"outN=%d", outN); //outN=11 }
用Block代替代理
假如controller 的名字为: MyUIViewController
1).声明一个block(假设无返回值)
typedef void(^onSearch)(NSString *text);
2).在controller(事件触发源的地方)定义block
//定义成员属性 @property(nonatomic)onSearch onSearchBlock; //添加setter方法 -(void)setOnSearchBlock:(void(^)(NSString *searchText)) block;
3).在对应的m文件里面实现setter方法
-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block{ if (block) { self.onSearchBlock = block; } }
4)在controller 中使用block实现回调,如:
-(void)searchHandler:(id)sender { if (self.searchBlock) { //这里传具体的参数,要查询的文本 self.searchBlock(@"your search keyword") } }
5)在其它地方,接收传过来的参数,如:
MyUIViewController *vc = [MyUIViewController new]; [vc setOnSearchBlock:^(NSString *searchText) { NSLog(@"get search keyword") }]
注: 如果需要在block 里面调用self,则需要用weak 修饰避免整个类循环copy.如: __weak typeof(self) wself = self;
相关文章推荐
- 蓝懿iOS培训日志20 MKMap
- ios开发:Core Data概述
- 给ImageView添加约束后,在裁圆角作为头像,在ios9无效bug
- ios的系统框架
- iOS开发-常用第三方开源框架介绍
- iOS开发系列--音频播放、录音、视频播放、拍照、视频录制
- iOS改变状态栏的字体颜色
- iOS开发入门杂记
- iOS开源项目学习—— AFNetworking
- ios URL 中文乱码问题
- ios pop 折叠动画
- IOS 懒加载,死循环
- IOS开发过程中与嵌入的网页数据交互
- iOS_AFNetWorking框架分析
- IOS 纯代码实现视图控制器的封装
- IOS UDP小例子总结
- iOS项目开发实战——Label中字体字号与Label多行显示
- IOS 实现美图秀秀
- IOS 实现植物大战僵尸
- IOS tableView下拉刷新,上拉刷新(LOW)