Block的使用--初探Block
看了两天的Block。
网上是有非常多解说与教程,也有讲得非常好的。这里就主要解说下我的理解与收获。欢迎拍砖。
所谓block。我觉得应该是一个闭包函数。而闭包,就是说block以及内部全部的变量生命周期都在其调用函数的生命周期内。
它一被调用完毕,则会被立刻释放。这里不讲运行机制,仅仅简要地讲基本的用法(这里所讲是基于ARC的环境下)。
定义以及使用
1、放在函数体内的Block:生命周期:仅仅存在于函数体。与函数体内的局部变量相似。
其定义方式跟函数还是非常相似的。为了简便理解我们对照下block与函数的定义。先看一下最简单的形式,无返回值带參。先看Block直接放在函数体内的形式:
函数:
- (void)printBlock:(NSString *)output {
NSLog(@"output == %@", output);
}
Block直接放在函数体内的形式:
void(^printBlock)(NSString *) = ^(NSString *output)
{
NSLog(@"output == %@", output);
};
这里能够看到。我们的函数体一般形式是:
- (返回值) 函数名: (形參)...
调用形式是:[调用对象 函数名(形參)];
那我们放在函数体内的Block定义则是:
返回值 (^ Block名)( 形參 ) = ^( 形參 ){ //实现内容 };
调用形式是 :Block名(形參)。
这里的Block就相当于是一个内嵌函数。
声明与实现要同一时候放在一起。形式就非常像我们寻常使用的对象赋值一样:id obj = ... ;
2、放在函数外的Block。
即为类内部范围内的全局Block。生命周期为整个类内部。
定义与用法都与上面一致,仅仅只是就像局部变量与类变量一样是否可被其它方法调用而已。为了更简单明了我们能够看一下这个代码:
//普通方法定义
- (void)printBlock:(NSString *)output {
NSLog(@"output == %@", output);
}
//函数体外的Block
void(^printBlock)(NSString *) = ^(NSString *output)
{
NSLog(@"output == %@", output);
};
//Block调用
- (void)printSomething {
printBlock(@"I'm printBlock");
}
3、放在类定义头文件的Block。
可被实例对象拥有。生命周期为整个实例对象。
头文件里的定义(1):
typedef void(^printBlockClass)(NSString *);
@interface BlockClass : NSObject
@property (nonatomic, copy)printBlockClass print;
@end
//或者在实现文件里:
//但这样的实如今内部的Block我也不知道有什么卵用。实际应用不大。
@interface BlockClass : NSObject
{
printBlockClass print;
}
@end
头文件里的定义(2):
//与方式一的差别无非像是自己定义一种结构然后你再去使用一样
@interface BlockClass : NSObject
@property (nonatomic, copy) void(^printBlockClass)(NSSting *output);
@end
这样的把Block作为属性的情况是比較多用于页面传值中。
关于Block的使用另一下几个注意点:
1、仅仅有在调用Block的时候才会运行{}内部的代码(就比方把Block定义在函数体内不调用是不会运行的)。
2、在Block的{}内部代码中是对外部的变量能够引用,但不能改变。假设试图更改会产生一个编译器错误。除非你把想要更改的变量声明时加上 __block关键字。
3、在block使用过程要注意不要产生循环引用。
关于循环引用(Memory Recycle)这里有一篇文章写得不错。有兴趣能够看看:http://blog.csdn.net/fengsh998/article/details/38090205
Block的使用--初探Block的更多相关文章
- 写给喜欢用Block的朋友(ios Block)
作者:fengsh998原文地址:http://blog.csdn.net/fengsh998/article/details/38090205转载请注明出处如果觉得文章对你有所帮助,请通过留言或关注 ...
- block的用法以及block和delegate的比较(转发)
看到一篇写的关于block和delegate放在一起来方便大家理解的文章,感觉不错,就推荐给大家来看一下. 代理设计模式对于iOS开发的人来说肯定很熟悉了,代理delegate就是委托另一个对象来帮忙 ...
- Objective-C中Block语法、Block使用以及通过Block实现数组排序
Block:语法块,本质上是匿名函数(没有名称的函数) 标准C里面没有Block,C语言的后期扩展版本,加入了匿名函数 在C++.JS.Swift等语言有类似语法,叫做闭包 Block语法和C语言里的 ...
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...
- Block高级用法:Block传值UI_12(3)
1.简单复习Block的定义.赋值.调用做学习传值铺垫: //声明一个函数 无返无参void printfHello(int a);//函数的实现void printfHello(int a){ ...
- 文件系统的block 数据库中的block 以及内存中的page基础知识汇总(自己理解 可能有误)
1. 操作系统文件系统中的的block 文件系统中的block 是文件系统最小的读写单元,在HDD的磁盘时代, 一般block的大小可能与磁盘的扇区大小一致为 512bytes 也因为这个原因MBR启 ...
- ORA-01578 ORACLE data block corrupted (file # 29, block # 2889087)
BW数据库后台报错如下:F:\oracle\SBP\saptrace\diag\rdbms\sbp\sbp\trace ORA-01578: ORACLE data block corrupted ( ...
- block(九)Block 和 Delegate 的使用比较
Block 和 Delegate中的方法都可以理解成回调函数,当某件事情发生的时候取执行一段代码片段 Block(代码块) 优点:是一种轻量级的回调,能够直接访问上下文,使用块的地方和块的实现地方在同 ...
- Block系列2:Block内存管理
ViewController.h #import <UIKit/UIKit.h> @interface ViewController : UIViewController { UIImag ...
- 转:InnoDB Log Block Structure(InnoDB日志Block结构详解)
文章转载自等博 InnoDB Log Block Structure(InnoDB日志Block结构详解)
随机推荐
- Vue 做项目经验
Vue 做项目经验 首先需要知道最基本的东西是: Vue 项目打包:npm run build Vue生成在网页上看的端口:npm run dev 修改端口号的地方在: config文件夹下index ...
- 设计模式实例(Lua)笔记之七(Decorator模式)
1.描写叙述 就说说"我"上小学的的糗事吧. 我上小学的时候学习成绩非常的差,班级上 40 多个同学,我基本上都是在排名 45 名以后,依照老师给我的定义就是"不是读书的 ...
- ZOJ 3688
做出这题,小有成就感 本来已打算要用那个禁位的排列公式,可是,问题在于,每个阶乘前的系数r的求法是一个难点. 随便翻了翻那本美国教材<组合数学>,在容斥原理一章的习题里竟有一道类似,虽然并 ...
- 代理模式之cglib动态代理
上一篇博客说了实现InvocationHandler接口的jdk动态代理,还有一种实现动态代理的方式则是:通过继承的方式实现的cglib动态代理. 先在程序中导入cglib的包,cglib-nodep ...
- nyoj--301--递推求值(经典矩阵运算)
递推求值 时间限制:1000 ms | 内存限制:65535 KB 难度:4 描述 给你一个递推公式: f(x)=a*f(x-2)+b*f(x-1)+c 并给你f(1),f(2)的值,请求出f(n ...
- 编 写高性能的 SQL 语句注意事项
1. IS NULL 与 IS NOT NULL不能用 null 作索引, 任何包含 null 值的列都将不会被包含在索引中. 即使索引有多列这样的情况下,只要这些列中有一列含有 null,该列就会从 ...
- Activiti 23张表及7大服务详解
7大服务介绍 服务名称 描述 RepositoryService Activiti 中每一个不同版本的业务流程的定义都需要使用一些定义文件,部署文件和支持数据 ( 例如 BPMN2.0 XML 文件, ...
- python 之 MRO 异常
今天突然遇到这个异常,先贴两个地址,待有时间写博客 https://www.jianshu.com/p/fea6e0a0cc14 https://makina-corpus.com/blog/meti ...
- 30 个实例详解 ,让运维彻底搞清TOP 命令!
Linux中的top命令显示系统上正在运行的进程.它是系统管理员最重要的工具之一.被广泛用于监视服务器的负载.在本篇中,我们会探索top命令的细节.top命令是一个交互命令.在运行top的时候还可以运 ...
- Springboot+swagger2的接口文档开发
一.创建一个SpringBoot项目 1. 2. 3. 4. 把web里的web选中,SQL里选择自己需要的,点击next 二.创建各项所需的controller,configure等 1. 项目布局 ...