主要内容:

  • block基本声明格式
  • block访问区域变量
  • block代替代理

block基本声明格式:

^(传入的参数){具体代码};

注: Block实体开头是“^”,接着是由小括号所包起来的参数列(比如 int a, int b, int c),行为主体由大括号包起来,专有名字叫做block literal。行为主体可以用return回传值,类型会被compiler自动辨别。如果没有参数列要写成: ^(void)。

最简单的例子:

^(int a){return a*a};

简单调用例子:

int result = ^(int a){return a*a}(5);
NSLog(@"%d", result);
//好像这个例子没什么用,个人不知道这样写的意义在哪。

Block Pointer(Block指针)

//声明一个square的Block Pointer,其所指向的Block有一个int输入和int输出
int (^square)(int);
//将Block实体指定给square
square = ^(int a){ return a*a ; };
//调用方法,感觉是是不是很像function的用法?
int result = square(5);
NSLog(@"%d", result);

Block 还可以当作方法传给参数,如:

-(void)objcMethod:(int(^)(int))square;  //square参数的类型是int(^)(int)

存取变量:

在同一个代码块里面,Block是可以读取Block之外的变量的,如:

{
int outN = 8;
int (^myPtr)(int) = ^(int a){ return outN + a;};
//block里面可以读取同一类型的outN的值
int result = myPtr(3); // result is 11
NSLog(@"result=%d", result);
}

当变量为简单类型时,Block是直接copy当前变量的,而不是引用,如:

{
int outN = 8;
int (^myPtr)(int) = ^(int a){ return outN + a;};
//block里面可以读取同一类型的outN的值
//改变outN 的值
outN = 5;
int result = myPtr(3); // result is 11
NSLog(@"result=%d", result);
}

注:如果变量被static修饰过,会有一样的效果

当变量为指针时,如:

{
NSMutableString string = [[NSMutableString alloc]initWithString:@"aaaa"];
int (^myPtr)(int) = ^(int a){[string setString:@"changed!"] return a + a;};
//block里面可以读取同一类型的outN的值
int result = myPtr(3); // result is 11
NSLog(@"string =%@", string);// string =changed
}

Block variable(Block类型变量)

在某个变量前面如果加上修饰字“__block”的话(注意,block前面有两个下划线),这个变量就称作block variable。

那么在block里面就可以任意修改此变量的值,如:

{
int outN = 8;
int (^myPtr)(int) = ^(int a){ return outN+= a;};
//block里面可以读取同一类型的outN的值
int result = myPtr(3); // result is 11
NSLog(@"outN=%d", outN); //outN=11
}

用Block代替代理

假如controller 的名字为: MyUIViewController

1).声明一个block(假设无返回值)

typedef void(^onSearch)(NSString *text);

2).在controller(事件触发源的地方)定义block

//定义成员属性
@property(nonatomic)onSearch onSearchBlock;
//添加setter方法
-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block;

3).在对应的m文件里面实现setter方法

-(void)setOnSearchBlock:(void(^)(NSString *searchText)) block{
if (block) {
self.onSearchBlock = block;
}

4)在controller 中使用block实现回调,如:

-(void)searchHandler:(id)sender {
if (self.searchBlock) {
//这里传具体的参数,要查询的文本
self.searchBlock(@"your search keyword")
}
}

5)在其它地方,接收传过来的参数,如:

MyUIViewController *vc = [MyUIViewController new];
[vc setOnSearchBlock:^(NSString *searchText) {
NSLog(@"get search keyword")
}]

注: 如果需要在block 里面调用self,则需要用weak 修饰避免整个类循环copy.如: __weak typeof(self) wself = self;

iOS block的更多相关文章

  1. iOS Block界面反向传值

    在上篇博客 <iOS Block简介> 中,侧重解析了 iOS Block的概念等,本文将侧重于它们在开发中的应用. Block是iOS4.0+ 和Mac OS X 10.6+ 引进的对C ...

  2. iOS block从零开始

    iOS block从零开始 在iOS4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调. block的结构 先来一段简单的代码看看: void ...

  3. iOS block 机制

    本文要将block的以下机制,并配合具体代码详细描述: block 与 外部变量 block 的存储域:栈块.堆块.全局块 定义 块与函数类似,只不过是直接定义在另一个函数里,和定义它的那个函数共享同 ...

  4. ios Block详细用法

    ios Block详细用法 ios4.0系统已开始支持block,在编程过程中,blocks被Obj-C看成是对象,它封装了一段代码,这段代码可以在任何时候执行.Blocks可以作为函数参数或者函数的 ...

  5. iOS Block的本质(四)

    iOS Block的本质(四) 上一篇文章iOS Block的本质(三)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block内修改变量的值 int main(int ar ...

  6. # iOS Block的本质(三)

    iOS Block的本质(三) 上一篇文章iOS Block的本质(二)中已经介绍过block变量的捕获,本文继续探寻block的本质. 1. block对对象变量的捕获,ARC 环境 block一般 ...

  7. iOS Block的本质(二)

    iOS Block的本质(二) 1. 介绍引入block本质 通过上一篇文章Block的本质(一)已经基本对block的底层结构有了基本的认识,block的底层就是__main_block_impl_ ...

  8. iOS Block的本质(一)

    iOS Block的本质(一) 1.对block有一个基本的认识 block本质上也是一个oc对象,他内部也有一个isa指针.block是封装了函数调用以及函数调用环境的OC对象. 2.探寻block ...

  9. (译)IOS block编程指南 1 介绍

    Introduction(介绍) Block objects are a C-level syntactic and runtime feature. They are similar to stan ...

  10. [IOS Block和delegate的对比]

    原文:http://blog.sina.com.cn/s/blog_9e8867eb0102uykn.html 这篇文章建议和前一篇一起看, 另外先弄清楚IOS的block是神马东东. 委托和bloc ...

随机推荐

  1. MySQL练习题参考答案

    MySQL练习题参考答案 2.查询“生物”课程比“物理”课程成绩高的所有学生的学号: 思路: 获取所有有生物课程的人(学号,成绩) - 临时表 获取所有有物理课程的人(学号,成绩) - 临时表 根据[ ...

  2. python 杂七杂八 :

    subprocess.Popen(...) python3 实现代码: 备注write 要使用bytes 在最后结果转为str 显示时才不会出现 b'' 这样的字节显示 import subproce ...

  3. UVA1585

    #include<stdio.h> #include<string.h> int main(){ int n; ]; scanf("%d",&n); ...

  4. [转]CSS 类名的单词连字符:下划线还是横杠?

    问题 CSS 类或 ID 命名时单词间连接通常有这几种写法: 驼峰式: solutionTitle.solutionDetail 用横杠连接: solution-title.solution-deta ...

  5. Linux指令

    文件指令 ls: ls -a :把隐藏的文件显示 ls -l  显示文件的详细信息 -lh  也是显示文件的详细信息,只是文件的大小是以k单位 ls -ld 显示指定目录下的信息 mkdir: mkd ...

  6. 论php数组合并

    注:尽量不要在循环中操作数据库. 1.两个一维数组合并成一个一维数组 $a = array('morning','afternoon','night'); $b = array('breakfast' ...

  7. laypage分页

    1.分页 laypage({ cont:$("#page"), //容器,仅支持id名\原生DOM对象,jquery对象 pages:, //总页数 skip:true, //是否 ...

  8. Java使用Fork/Join框架来并行执行任务

    现代的计算机已经向多CPU方向发展,即使是普通的PC,甚至现在的智能手机.多核处理器已被广泛应用.在未来,处理器的核心数将会发展的越来越多. 虽然硬件上的多核CPU已经十分成熟,但是很多应用程序并未这 ...

  9. c#面试题汇总

    下面的参考解答只是帮助大家理解,不用背,面试题.笔试题千变万化,不要梦想着把题覆盖了,下面的题是供大家查漏补缺用的,真正的把这些题搞懂了,才能“以不变应万变”.回答问题的时候能联系做过项目的例子是最好 ...

  10. VB操作EXCEL文件

    用VB操作Excel(VB6.0)(整理) 首先创建Excel对象,使用ComObj:Dim ExcelID as Excel.ApplicationSet ExcelID as new Excel. ...