Object-C : Block的实现方式
摘自:http://www.cnblogs.com/GarveyCalvin/p/4204167.html>
Date : 2015-12-4
前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量。你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观。顺带一提,苹果很多的接口(API)都使用了Block。
一、Block的基本定义
Block的基本写法(也是详细写法):
returnType (^blockName)(params) = ^returnType(params) {
// code...
};
中文再解释:返回类型 (^Block的名字)(Block的参数) = ^返回类型(Block的参数) { 这里放代码 },例:
int (^myBlock)(int num1, int num2) = ^int(int num1, int num2){
return ;
};
如果你的Block不需要返回类型和参数,那么你可以简写为:
void (^myBlock2)() = ^(){
};
或
void (^myBlock2)(void) = ^void(void){
};
返回类型或参数,没有的话可以用“void”代替。
你也可以把等于号右边,^后的()删除,即是:
void (^myBlock2)() = ^{
};
这样是不是很简洁?
你也可以先定义一个Block函数,但不写函数的实现,我们可以在后面再写具体函数的实现,像这样:
void (^myBlock2)(void);
myBlock2 = ^{ };
二、Block作为方法定义
把Block定义在方法里,与上面不同的是,Block的名字不需要在声明时写上,而是在后面,像这样:
- (void)getWtihBlock:(void (^)())block
{
// code... // 记得要调用block
block();
}
使用方法:
[self getWtihBlock:^{
NSLog(@"sdf");
}];
下面作了一个详细点的例子,并写了备注:
/**
* 追加自身字符串N次(每次复制前加一个换行\n)
*
* @param string 字符串
* @param count 追加次数
* @param stringBlock 目标Block,其中str参数为结果字符串
*/
// Block也可以定义在方法里,但是不需要定义Block的名字
// IOS开发很多的API也用到了Block,像UIView的块动画
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock
{
NSMutableString *newString = [NSMutableString stringWithString:string];
for (NSUInteger i = ; i < count; i++) {
NSUInteger len = [string length];
NSString *insertString = [NSString stringWithFormat:@"\n%@", string];
[newString insertString:insertString atIndex:len];
}
// 调用block,传入字符串newString
stringBlock(newString);
}
用法也是一样:
BlockObject *block = [[BlockObject alloc] init];
[block getStrWithString:@"Garvey"
CopyCount:
resultString:^(NSString *str) {
// str为处理后的结果
NSLog(@"str is %@", str);
}];
有时候复杂的Block语法会令到函数的声明难以阅读,所以会经常使用typedef对Block起一个新类型。
typedef void (^ResultBlock)(NSString *str);
定义方法时就变成了:
- (void)getStrWithString2:(NSString *)string
CopyCount:(int)count
resultString:(ResultBlock)stringBlock;
让我们对比一下,使用typedef前后:
// 使用前
- (void)getStrWithString:(NSString *)string
CopyCount:(int)count
resultString:(void (^)(NSString *str))stringBlock; // 使用后
- (void)getStrWithString2:(NSString *)string
CopyCount:(int)count
resultString:(ResultBlock)stringBlock;
注意:使用方法是一样的,只不过定义变得简单了。
如果你一直在使用代理(Delegate)进行方法回调,那么你现在可以尝试使用Block了。
博文作者:GarveyCalvin
博文出处:http://www.cnblogs.com/GarveyCalvin/
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
Object-C : Block的实现方式的更多相关文章
- Object-C语言Block的实现方式
开场白 Block基本概念 中间态转换方法 Block编译后结果分析 Block运行时状态与编译状态对比 开场白 Object-C语言是对C语言的扩展,所以将OC源码进行编译的时候,会将OC源 ...
- openpyxl使用sheet.rows或sheet.columns报TypeError: 'generator' object is not subscriptable解决方式
解决方案: 因为新版本的openpyxl使用rows或者columns返回一个生成器所以可以使用List来解决报错问题 >>> sheet.columns[0] Traceback ...
- iOS 转换异步block为同步方式运行
使用dispatch_semaphore_t 实现 dispatch_semaphore_t sema = dispatch_semaphore_create(0); //创建信号量 __block ...
- iOS开发-Objective-C Block的实现方式
前言:我们可以把Block当作一个闭包函数,它可以访问外部变量和局部变量,但默认是不可以修改外部变量.你可以使用它来做回调方法,比起使用代理(Delegate)会更加直观.顺带一提,苹果很多的接口(A ...
- iOS中数据传值的几种方式
值传递:基本数据类型的变量之间的数据传递 //值传递不会改变变量的值 void func(int a) { a = ; } int main(int argc, const char * argv[] ...
- Oracle中 根据 file# 和 block# 找到对象
我们在10046生产的trace 文件里经常看到下面的信息. 表示系统在等待散列读取某个文件号的某个块开始的8个块. WAIT #6: nam='db file scattered read' ela ...
- iOS分享 - 对象间的通信之delegate、notificationCenter与block
在项目开发中,常常会涉及到对象之间的通信,而为了降低对象间的耦合,会采用delegate.notificationCenter.block三种方式来进行实现,对于他们的使用,也许大家都能熟练掌握,但是 ...
- 理解 block
开始:Block 简介 Block 是 iOS 4.0 和 Mac OSX 10.6 引入的一个新特性. Block 可以极大的简化代码. 他们可以帮助你减少代码, 减少对代理的依赖, 并且写出更加简 ...
- 3种方式实现KVO并进行对比
KVO KVO属于设计模式中的观察者模式,在观察者模式中,一个对象任何状态的变更都会通知另外的对改变感兴趣的对象.这些对象之间不需要知道彼此的存在,这其实是一种松耦合的设计.当某个属性变化的时候,我们 ...
随机推荐
- 、web前端的这么知识应该是怎样的一个知识体系架构?
.web前端的这么知识应该是怎样的一个知识体系架构?之前我以为可以以W3C为纲要,把W3C的东西学会了就够了.后来发现我错了,W3C还不全面. 真正全面的覆盖了web前端知识体系的东西是——浏览器内核 ...
- 【secureCRT】如何在secureCRT上设置常用的快捷输出按钮栏
转自:http://jingyan.baidu.com/article/5d6edee2f32de199eadeec25.html 方法/步骤 打开secureCRT软件,单击菜单栏上面的[查看] ...
- 常用的rpm和yum的一些命令
常用的rpm命令 rpm -qa | grep coreutils <-- 查看系统上是否已经安装了coreutils rpm -qi coreutils < ...
- jQuery 遍历函数(w3school)
jQuery 遍历函数包括了用于筛选.查找和串联元素的方法. 函数 描述 .add() 将元素添加到匹配元素的集合中. .andSelf() 把堆栈中之前的元素集添加到当前集合中. .childr ...
- Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux
Install MongoDB on Red Hat Enterprise, CentOS, Fedora, or Amazon Linux¶ Overview Use this tutorial t ...
- 如何修改ECShop发货单查询显示个数
使用ecshop的朋友都知道,商城首页调用的发货单查询,默认显示的10个.很多朋友想修改它的数量,可是在后台管理却找不到相应的地方,这个修改和显示排行榜的数量修改方法不一样.排行榜是可以在后台修改的, ...
- gridview 经典
一.gridview 中弹出超链接 <%--好方法:超链接列中可以直接从数据库获取完整字段,然后选择在当前窗口打开 Target="mainframe" --%> &l ...
- C语言的数组名和对数组名取地址
http://blog.csdn.net/zdcsky123/article/details/6517811 相信不少的C语言初学者都知道,数组名相当于指针,指向数组的首地址,而函数名相当于函数指针, ...
- 【转】Eclipse Console 加大显示的行数,禁止弹出
转载地址:http://blog.csdn.net/leidengyan/article/details/5686691 Eclipse Console 加大显示的行数: 在 Preferences- ...
- AndroidManifest.xml 详解
第1部分 标签库+包路径+版本控制 <manifest xmlns:android="http://schemas.android.com/apk/res/android" ...