iOS中Block的基础用法
来源:互联网 发布:魅动力知乎 编辑:程序博客网 时间:2024/04/29 16:48
本文简介
本章不会对Block做过多的实现研究。只是讲解基本的用法。纯粹基础知识。结合实际项目怎么去做举例。Block使用场景,可以在两个界面的传值,也可以对代码封装作为参数的传递等。用过GCD就知道Block的精妙之处。
Block简介
Block是一种比较特殊的数据类型。它可以保存一段代码,在合适的时候取出来调用。
代码块本质上是和其他变量类似。不同的是,代码块存储的数据是一个函数体。使用代码块是,你可以像调用其他标准函数一样,传入参数数,并得到返回值。
脱字符(^)是块的语法标记。按照我们熟悉的参数语法规约所定义的返回值以及块的主体(也就是可以执行的代码)。下图是如何把块变量赋值给一个变量的语法讲解:
Block的修饰
ARC情况下
1.如果用copy修饰Block,该Block就会存储在堆空间。则会对Block的内部对象进行强引用,导致循环引用。内存无法释放。
解决方法:
新建一个指针(__weak typeof(Target) weakTarget = Target )指向Block代码块里的对象,然后用weakTarget进行操作。就可以解决循环引用问题。
2.如果用weak修饰Block,该Block就会存放在栈空间。不会出现循环引用问题。
MRC情况下
用copy修饰后,如果要在Block内部使用对象,则需要进行(__block typeof(Target) blockTarget = Target )处理。在Block里面用blockTarget进行操作。
Block的定义格式
返回值类型(^block变量名)(形参列表) = ^(形参列表) {
};
调用Block保存的代码
block变量名(实参);
默认情况下,Block内部不能修改外面的局部变量
Block内部可以修改使用__block修饰的局部变量
Block的模式
1.无参数无返回值的Block
2.有参数无返回值的Block
3.有参数有返回值的Block
Block简单用法举例
/** * 无参数无返回值的Block */-(void)func1{ /** * void :就是无返回值 * emptyBlock:就是该block的名字 * ():这里相当于放参数。由于这里是无参数,所以就什么都不写 */ void (^emptyBlock)() = ^(){ NSLog(@"无参数,无返回值的Block"); }; emptyBlock();}
2.有参数无返回值的Block
/** * 调用这个block进行两个参数相加 * * @param int 参数A * @param int 参数B * * @return 无返回值 */ void (^sumBlock)(int ,int ) = ^(int a,int b){ NSLog(@"%d + %d = %d",a,b,a+b); }; /** * 调用这个sumBlock的Block,得到的结果是20 */ sumBlock(10,10);
3.有参数有返回值的Block
/** * 有参数有返回值 * * @param NSString 字符串1 * @param NSString 字符串2 * * @return 返回拼接好的字符串3 */ NSString* (^logBlock)(NSString *,NSString *) = ^(NSString * str1,NSString *str2){ return [NSString stringWithFormat:@"%@%@",str1,str2]; }; //调用logBlock,输出的是 我是Block NSLog(@"%@", logBlock(@"我是",@"Block"));
Block结合typedef使用
自己定义一个Block类型,用定义的类型去创建Block,更加简单便捷。
这里举例一个Block回调修改上一下界面的背景颜色。
ViewController1 控制器1,ViewController2 控制器2
控制器1跳转到控制器2,然后在控制器2触发事件回调修改控制器1的背景颜色为红色。
ViewController2的实现
<span style="font-size:14px;">#import <UIKit/UIKit.h>@interface ViewController2 : UIViewController/** * 定义了一个changeColor的Block。这个changeColor必须带一个参数,这个参数的类型必须为id类型的 * 无返回值 * @param id */typedef void(^changeColor)(id);/** * 用上面定义的changeColor声明一个Block,声明的这个Block必须遵守声明的要求。 */@property (nonatomic, copy) changeColor backgroundColor;@end</span>
<span style="font-size:14px;">-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ //声明一个颜色 UIColor *color = [UIColor redColor]; //用刚刚声明的那个Block去回调修改上一界面的背景色 self.backgroundColor(color);}</span><span style="font-size: 15px;"></span>
ViewController1的实现
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{ ViewController2 *vc =[[ViewController2 alloc]init]; // 回调修改颜色 vc.backgroundColor = ^(UIColor *color){ self.view.backgroundColor = color; }; [self.navigationController pushViewController:vc animated:YES];}
- iOS中Block的基础用法
- iOS中Block的基础用法
- iOS中Block的基础用法
- IOS中block的用法
- iOS中block的用法
- IOS中block的用法
- iOS中Block的基础
- iOS中使用block块的用法
- iOS中Block的简单用法
- IOS 中block结构的简单用法
- IOS 中block结构的简单用法
- IOS 中block结构的简单用法
- IOS 中block结构的简单用法
- IOS中关于Block的用法总结
- iOS block的用法
- iOS block的用法
- iOS block的用法
- iOS block的用法
- javascript中数组的一些常用方法
- Android 全屏无标题
- 实现一个最简单的VIM文本编辑器(可能有bug,随便写了一个)
- 排列的字典序问题 算法与设计
- 【bzoj 2330】[SCOI2011]糖果 差分约束
- iOS中Block的基础用法
- android 底部导航栏
- Web:前门进后门出(HTML+CSS>小笔记)
- c#-计算两个空间点形成的单位向量
- http与https的介绍
- CSDN进入不了博客界面
- 网页特殊符号大全
- 编程实现 自动获取每天深圳一手房二手房的成交量与成交面积
- Mybatis传多个参数