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结构详解)
随机推荐
- STM32 使用Cubemx 建一个USB(HID)设备下位机,实现数据收发
这里我主要说一下如何做一个USB下位机,这里主要分3部分:1.建立工程:2.添加报文描述符:3.数据的传输.这里就不讲USB的理论知识了,有想要了解的自行百度一下就可以了. 建立工程:工程建立参考:h ...
- Visual Studio 2015 改变窗体图标 & 任意位置打开窗体 & 禁止鼠标改动窗体大小
1.改变窗体图标 先把图标放到项目文件夹中,然后点击窗体属性的ICON添加即可. 参考:https://www.cnblogs.com/yangxuli/p/8075484.html?tdsource ...
- js获得 json对象的个数(长度)
function getJsonObjLength(jsonObj) { var Length = 0; for (var item in jsonObj) { Length++; } return ...
- java的反射机制(重要)
1,反射的概念 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法和属性:这种动态获取的信息以及动态调用对象的方法的功能称为 ...
- 2015 Multi-University Training Contest 1 hdu 5296 Annoying problem
Annoying problem Time Limit: 16000/8000 MS (Java/Others) Memory Limit: 65536/65536 K (Java/Others ...
- Nutch2 WebPage写入数据库的过程分析
版本: Nutch 2.2.1 本文通过InjectJob来追踪webpage的定义.创建.传递.序列化.写入数据库的整个过程.从源码中摘录了重要的代码行,并标明其所在文件名.行号. 1. 定义 sc ...
- WinServer-IIS-svg/woff/woff2字体 404错误
问题:最近在IIS上部署web项目的时候,发现浏览器总是报找不到woff.woff2字体的错误.导致浏览器加载字体报404错误,白白消耗了100-200毫秒的加载时间. 原因:因为服务器IIS不认SV ...
- we标签
功能: · 辅助标签.配合其它标签使用,防止与标准html标签冲突 · 别名为test 使用方法: <we [name=key]>[value]</we& ...
- 第十七章_Web注解
1.HandlesTypes 这个注解类型用来声明ServletContainerInitializer能够处理哪些类型的类.它有一个属性.一个值.用来声明类的类型.比如,以下的ServletCont ...
- html屏蔽鼠标右键
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...