iOS开发-Objective-C Block的实现方式
前言:我们可以把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/
本文版权归作者和博客园共有,欢迎转载,但须保留此段声明,并给出原文链接,谢谢合作!
iOS开发-Objective-C Block的实现方式的更多相关文章
- iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值)
iOS开发:使用Block在两个界面之间传值(Block高级用法:Block传值) 使用Block的地方很多,其中传值只是其中的一小部分,下面介绍Block在两个界面之间的传值: 先说一下思想: ...
- iOS开发之使用block块进行数据遍历的方法
看了一篇文章,发现遍历数组.字典中的数据时,除了使用for循环外,还可以使用block块进行操作,瞬间感觉iOS的语言代码确实有点高大上的感觉,下面就简单的介绍一下这个方法. 首先是最基本的运用形式, ...
- iOS开发系列--C语言之存储方式和作用域
概述 基本上每种语言都要讨论这个话题,C语言也不例外,因为只有你完全了解每个变量或函数存储方式.作用范围和销毁时间才可能正确的使用这门语言.今天将着重介绍C语言中变量作用范围.存储方式.生命周期.作用 ...
- iOS开发——语法&高级Block练习
高级Block练习 一 .最简单的block使用 使用block的三个步骤:1.定义block变量 2.创建block代码块 3.调用block匿名函数 定义一个block的构成包括:返回值,bloc ...
- iOS开发中常用到的加密方式
1 base64 1.1 简介 Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码.它将需要编码的数据拆分成字节数组.以3个字节为一组.按顺序排列24位数据,再把这24位数据 ...
- 【iOS开发】添加子控件方式(懒加载,GCC)
// // ViewController.m // GCC // // Created by admin on 15/10/7. // Copyright © 2015年 admin. All rig ...
- iOS开发——代理与block传值
一.代理传值的方法 1.Hehe1ViewController.h中 #import <UIKit/UIKit.h> @protocol Hehe1ViewControllerDelega ...
- iOS开发-多层嵌套block中如何使用__weak和__strong
1.关于__weak__weak只能在ARC模式下使用,也只能修饰对象(比如NSString等),不能修饰基本数据类型(比如int等)__weak修饰的对象在block中不可以被重新赋值.__weak ...
- ios开发-载入viewcontroller的几种方式
Assuming you have storyboard, go to storyboard and give your VC an identifier (inspector), then do: ...
随机推荐
- python接口自动化5-Json数据处理
前言 有些post的请求参数是json格式的,这个前面第二篇post请求里面提到过,需要导入json模块处理. 一般常见的接口返回数据也是json格式的,我们在做判断时候,往往只需要提取其中几个关键的 ...
- Navicat Premium 12全系列
Navicat 是香港卓软数码科技有限公司生产的一系列 MySQL.MariaDB.Oracle.SQLite.PostgreSQL 及 Microsoft SQL Server 的图形化数据库管理及 ...
- Android UI-底部旋转菜单栏
以前都是说每逢佳节倍思亲,现在的工作状态是每到周末倍亲切,年底真的是加班加的没完没了的,也没时间写博客,也没时间学习,周末闲来无事看到一个比较有意思的旋转菜单,没事自己实战了一下感觉还不错,代码倒是没 ...
- Reverse Nodes in k-Group leetcode java
题目: Given a linked list, reverse the nodes of a linked list k at a time and return its modified list ...
- 只用CSS做到完全居中
我们都知道 margin:0 auto; 的样式能让元素水平居中,而 margin: auto; 却不能做到垂直居中……直到现在.但是,请注意!想让元素绝对居中,只需要声明元素高度,并且附加以下样式, ...
- javascript制作公式编辑器,函数编辑器和图形绘制
自己是电子信息方向的,因此总是需要处理大量的电路实验.电路数据和电路仿真处理,每次处理数据时候还需要同样的数据很多遍, 又需要关于电路的频率响应和时域响应情况,所以一直有做一个这样公式编辑器的打算了. ...
- 一直出现 Enter passphrase for key '/root/.ssh/gitkey12.pub'
案例: 我一下没有设置密码的pub key, 一使用就要求: Enter passphrase for key '/root/.ssh/gitkey12.pub', 原因:本该设置私钥的地方,设置 ...
- [Javascript] Function Expression Ex, Changing Declarations to Expressions
Inside the Haunted Hickory House file, developers for the Forest of Function Expressions Theme Park ...
- LINUX设备驱动程序笔记(五)中断处理
<一> 中断处理流程例如以下: 1.发生中断时,CPU运行异常向量vector_irq的代码. 2.在vector_irq里面.终于会调用中断处理的总入口函数asm_do_IRQ ...
- 整理两个PetaPoco连接SQLite数据库的方法
从https://github.com/qingask/PetaPoco.NetCore下载源文件压缩包 解压出文件PetaPoco.Multiple.cs.PetaPoco.NetCore.cs 放 ...