原文链接:http://www.jianshu.com/p/17872da184fb

本文简介

本章不会对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

/***  无参数无返回值的Block*/
-(void)func1{/***  void :就是无返回值*  emptyBlock:就是该block的名字*  ():这里相当于放参数。由于这里是无参数,所以就什么都不写*/void (^emptyBlock)() = ^(){NSLog(@"无参数,无返回值的Block"); }; emptyBlock(); }

有参数无返回值的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);

有参数有返回值的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的实现

#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
-(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{//声明一个颜色 UIColor *color = [UIColor redColor]; //用刚刚声明的那个Block去回调修改上一界面的背景色 self.backgroundColor(color); }

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]; }

转载于:https://www.cnblogs.com/liuyingjie/p/5274497.html

iOS中Block的基础用法相关推荐

  1. pandas object转float_Pandas中文官档~基础用法6

    呆鸟云:"这一系列长篇终于连载完了,还请大家关注 Python 大咖谈,这里专注 Python 数据分析,后期呆鸟还会给大家分享更多 Pandas 好文." 数据类型 大多数情况下 ...

  2. Pandas中文官档 ~ 基础用法1

    呆鸟云:"在学习 Python 数据分析的过程中,呆鸟发现直接看官档就是牛逼啊,内容全面.丰富.详细,而 Python 数据分析里最核心的莫过于 pandas,于是就想翻译 pandas 官 ...

  3. c语言block内部的实现原理,iOS中block变量捕获原理详析

    Block概述 Block它是C语言级别和运行时方面的一个特征.Block封装了一段代码逻辑,也用{}括起,和标准C语言中的函数/函数指针很相似,此外就是blokc能够对定义环境中的变量可以引用到.这 ...

  4. 【iOS】—— FMDB的基础用法

    一.基本介绍: 1.简介: 由于iOS中原生的 SQLite API 使用时非常不方便 ,于是就出现了一系列将 SQLite API 进行封装的库,例如FMDB.PlausibleDatabase.s ...

  5. (0033) iOS 开发之Block 的基础用法及注意事项2

    循环引用之String 当在block内部使用成员变量的时候,比如 @interface ViewController : UIViewController { NSString *_string; ...

  6. (0032) iOS 开发之Block 的基础用法及注意事项1

    该文章参考多篇文章,已记不清,如有问题请联系我. 参考:http://blog.csdn.net/zm_yh/article/details/51469275 Block理解 1. Block执行的代 ...

  7. 函数遍历IOS中block的使用

    最近研究函数遍历,稍微总结一下,以后继续补充: block是ios4.0开始推出的,其特点是可以执行内联,作为参数传递到函数,block变量的定义,^ 用于运算符. -(id)loadNibWithC ...

  8. iOS中block的详解weakSelf、strongSelf-转自唐巧

    1 我们知道,在使用 block 的时候,为了避免产生循环引用,通常需要使用 weakSelf 与 strongSelf,写下面这样的代码: __weak typeof(self) weakSelf ...

  9. iOS中Block的使用注意事项

    //定义一个Block typedef returnType(^BlockName)(parameterA,parameterB,...) e.g:typedef void(^RequestResul ...

最新文章

  1. python pandas空值与缺失值处理
  2. Spring JDBC-使用Spring JDBC获取本地连接对象以及操作BLOB/CLOB类型数据
  3. json_encode 注意点
  4. java运用ascii实现动画效果_安卓开发20:动画之Animation 详细使用-主要通过java代码实现动画效果...
  5. VC2010 MFC文档类菜单快捷键无法加载问题
  6. 操作系统实验报告-系统调用
  7. 会计考计算机哪些知识,2017会计从业考试《会计电算化》考点之计算机网络基本知识...
  8. websphere 启动出错 检查节点 上服务器的日志_启动Redis Sentinel哨兵
  9. java harris corner_Harris Corner Detection
  10. 【华为认证】HCIA-DATACOM史上最全精选题库(附答案解析)
  11. CMake macOS安装
  12. 基于安卓手机的WAPI证书安装使用详解
  13. 中科大EPC课程查询自动选课
  14. 如何录屏制作gif图片
  15. 吱口令生成淘宝BP抢购链接
  16. Cesium中如何获取鼠标单击位置的经纬度
  17. 由矩阵运算来看初等矩阵的左乘右乘所影响到矩阵的行列变换的本质
  18. 华氏度与摄氏度的转化(C语言)
  19. Pr:Lumetri 范围
  20. 高斯金字塔和拉普拉斯金字塔实现图像融合

热门文章

  1. 使用Xtrabackup进行MySQL备份
  2. 第15组构建之法团队心得(2)
  3. linux之shell编程基本语法
  4. Ubuntu Terminal Shortcut
  5. MPMovieplayercontroller
  6. 存储基础知识二 主要协议SCSI、FC、iSCSI
  7. 出现ORA - 1017用户名/口令无效; 登录被拒绝 的问题
  8. TortoiseSVN Unable to connect to a repository at URL XXX
  9. Python矩阵处理库—Numpy库的基本使用
  10. kotlin集合操作符——过滤操作符