iOS开发基础block的形式讲解
2016-08-30 10:00
211 查看
前几个星期,我利用通知写了一个仿京东选择地址的Demo(http://blog.csdn.net/hbblzjy/article/details/52212879),后来看过一篇文章说,尽量少用通知,因为通知容易占据手机内存,即使你进行了通知移除处理,也不太保险,所以今天再次谈谈Block的使用,之前也写过一篇文章(http://blog.csdn.net/hbblzjy/article/details/51108159)。
首先在阅读本文之前,请尝试写出一下问题:
声明一个Block,并调用它。
声明一个Block型的属性。
声明一个方法,接受一个Block型的参数,并写出调用时传入的Block实参。
实现一个Block的递归调用(Block调用自己)。
实现一个方法,将Block作为返回值。
一、概念
首先需要了解的是Block是一个代码块,是一个变量的形式存在的。
二、构成了解
我们需要在函数中声明block,因为是变量的形式,而且存在静态变量形式
类型1:
NSString* (^blocks)(NSString*)= ^(NSString *str)
{
//NSLog(@"this is :%@",str);
return str;
};
返回值类型是字符串,如同函数一样,返回值类型写在最前面
^blocks是声明一个代码块,名字叫做blocks
后面括号跟的是参数的类型,如果没有参数返回void,如果有多个参数类型,那么逗号分隔列出
等于号后面的是参数名列表。
因为写的是一个有返回值的block,所以需要return一个与返回值类型相同类型的值,这里返回的是参数字符串
类型2:
int (^david)(int)= ^(int num)
{
return num*5;
};
这里的返回值类型是一个int,代码块名字叫做david,参数是一个int类型的变量
等于号后面是参数列表,执行的语句是return num *5这句话。
因为如上的两个例子都是有返回值的类型,那么我在调用的时候可以直接使用。
例如:
NSLog(@"this is block:%@",blocks(@"hello"));
NSLog(@"this is block:%d",blocks(5));
类型3:
void (^david)(void)= ^(void)
{
NSLog(@"I am a block code!");
};
这里只是简单的执行了一句话,调用方法就是直接打印或者当作变量直接使用,形式介绍:
参考:
http://blog.csdn.net/fhbystudy/article/details/17350951
http://stackoverflow.com/questions/10892361/generic-typeof-for-weak-self-references
http://stackoverflow.com/questions/14877415/difference-between-typeof-typeof-and-typeof-objective-c
http://rocry.com/2012/12/18/objective-c-type-of/
http://fuckingblocksyntax.com/ 这是个工具网站,写block的时候会用到。
http://www.jianshu.com/p/dc5ced9bd7e7
首先在阅读本文之前,请尝试写出一下问题:
声明一个Block,并调用它。
声明一个Block型的属性。
声明一个方法,接受一个Block型的参数,并写出调用时传入的Block实参。
实现一个Block的递归调用(Block调用自己)。
实现一个方法,将Block作为返回值。
一、概念
首先需要了解的是Block是一个代码块,是一个变量的形式存在的。
二、构成了解
我们需要在函数中声明block,因为是变量的形式,而且存在静态变量形式
类型1:
NSString* (^blocks)(NSString*)= ^(NSString *str)
{
//NSLog(@"this is :%@",str);
return str;
};
返回值类型是字符串,如同函数一样,返回值类型写在最前面
^blocks是声明一个代码块,名字叫做blocks
后面括号跟的是参数的类型,如果没有参数返回void,如果有多个参数类型,那么逗号分隔列出
等于号后面的是参数名列表。
因为写的是一个有返回值的block,所以需要return一个与返回值类型相同类型的值,这里返回的是参数字符串
类型2:
int (^david)(int)= ^(int num)
{
return num*5;
};
这里的返回值类型是一个int,代码块名字叫做david,参数是一个int类型的变量
等于号后面是参数列表,执行的语句是return num *5这句话。
因为如上的两个例子都是有返回值的类型,那么我在调用的时候可以直接使用。
例如:
NSLog(@"this is block:%@",blocks(@"hello"));
NSLog(@"this is block:%d",blocks(5));
类型3:
void (^david)(void)= ^(void)
{
NSLog(@"I am a block code!");
};
这里只是简单的执行了一句话,调用方法就是直接打印或者当作变量直接使用,形式介绍:
return_type表示返回的对象/关键字等(通常是
void)
blockName表示block的名称
var_type表示参数的类型
varName表示参数名称
三、声明一个Block,作为局部变量:
return_type (^blockName)(var_type) = ^return_type (var_type varName) { // ... }; blockName(var);
四、声明一个Block型的属性
注意与局部变量的声明比较,有细微差别,你能指出吗?@property (copy) return_type (^blockName) (var_type);
五、在定义方法时,声明Block型的形参
这里提供的是Block的定义- (void)yourMethod:(return_type (^)(var_type))blockName;
六、Block作为实参
调用方法时,传入Block,这里需要的是Block的具体实现[someObject doSomethingWithBlock: ^return_type (var_type varName) { //... }];如果已经定义了局部变量的Block,也可以直接传入名称。
七、匿名Block
Block实现时,如上文的局部变量和实参,等号右边就是一个匿名Block,它没有blockName:
^return_type (var_type varName) { //... };
八、typedef Block
利用typedef简化Block的声明:
typedef return_type (^BlockTypeName)(var_type);然后可用
BlockTypeName定义Block,类似类名的使用方法:
BlockTypeName aBlock = ^return_type (var_type) { //... }
九、内联 Block
这种形式并不常用,匿名Block声明后立即被调用:^return_type (var_type varName) { //... }(var);内联 Block可用于代码分块,提高代码可读性,功能类似大括号的代码块,其它功能非常有限:
{ //... }
十、递归调用Block
Block内部调用自身,递归调用是很多算法基础,特别是在无法提前预知循环终止条件的情况下。注意 由于Block内部引用了自身,这里必须使用__block避免保留环问题。
__block return_type (^blockName)(var_type) = [^return_type (var_type varName) { if (returnCondition) { blockName = nil; return; } // ... blockName(varName); } copy]; blockName(varValue);
十一、Block作为返回值
方法的返回值是一个Block,可用于一些“工厂模式”的方法中:- (return_type(^)(var_type))methodName { // ... }还有很多可参考的文章:
参考:
http://blog.csdn.net/fhbystudy/article/details/17350951
http://stackoverflow.com/questions/10892361/generic-typeof-for-weak-self-references
http://stackoverflow.com/questions/14877415/difference-between-typeof-typeof-and-typeof-objective-c
http://rocry.com/2012/12/18/objective-c-type-of/
http://fuckingblocksyntax.com/ 这是个工具网站,写block的时候会用到。
http://www.jianshu.com/p/dc5ced9bd7e7
相关文章推荐
- iOS开发基础block的形式讲解
- 实例讲解iOS应用UI开发之基础动画的创建
- IOS开发基础Object-C( 15)-- block的使用方法
- iOS开发基础:开发两年的你也不会写的Block
- (0033) iOS 开发之Block 的基础用法及注意事项2
- 黑马程序员——零基础学习iOS开发——12 Object-C block、protocol
- iOS 开发 block 篇 基础介绍
- iOS开发之基础篇(14)—— Block
- iOS开发总结之block回调以AFN为基础封装的网络请求操作类
- [ios开发基础之]代码块 ——block
- iOS开发——OC基础-ARC、BLOCK、协议
- (0032) iOS 开发之Block 的基础用法及注意事项1
- J2ME程序开发基础讲解
- J2ME程序开发全方位基础讲解汇总
- 【文章汇总】J2ME程序开发全方位基础讲解
- J2ME程序开发全方位基础讲解汇总
- J2ME程序开发全方位基础讲解汇总
- 【文章汇总】J2ME程序开发全方位基础讲解
- J2ME程序开发全方位基础讲解汇总
- J2ME程序开发全方位基础讲解汇总