blcok基础
来源:互联网 发布:cn域名个人备案 编辑:程序博客网 时间:2024/05/16 14:00
作者:溪石
原文链接:http://www.jianshu.com/p/dc5ced9bd7e7
阅读本文之前,请尝试写出一下问题:
声明一个Block,并调用它。
声明一个Block型的属性。
声明一个方法,接受一个Block型的参数,并写出调用时传入的Block实参。
实现一个Block的递归调用(Block调用自己)。
实现一个方法,将Block作为返回值。
现在拿出笔纸,放下手机,20分钟后见...
欢迎回来!如果你未能写出以上问题的答案,本文将给你答案。
本文使用以下符号,含义列举如下:
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{ // ...}
- blcok基础
- Blcok中引用对象
- Blcok的内存管理
- Blcok的那些事
- iOS blcok原理
- OC学习笔记之blcok
- 两个blcok的使用问题
- 什么是block内行迁移?intra blcok chain
- 使用blcok 造成内存不释放 解决办法
- IOS---Blcok(截获的自动变量)
- 关于界面切换 用blcok 回调 数据
- IE6的双边距-元素浮动display值为blcok
- CSS中的blcok、inline和inline-block的概念和区别
- 基础
- 基础
- 基础
- 基础
- 基础
- Anroid开发乱码解决
- Java学习笔记 Struts2常用标签
- CDQZ十天集训总结谭
- Android布局文件中android:textColor属性失效问题
- visual studio 2015快捷键整理
- blcok基础
- APICloud成长记录 二 页面框架搭建
- 光绘发明——LED视觉显示棒magicShifter3000,坚守15年的创造之旅!
- base64位字符 上传多张图片保存服务器端
- 互斥锁、条件变量、信号量
- Linux下多核、GPU编程
- Android酷炫实用的开源框架(UI框架)
- HttpServletRequestWrapper模拟实现分布式Session
- 微信蓝牙设备开发教程之获取蓝牙设备deviceid和设备二维码(2)