Block 是从 iOS4引入的,在日常开发中,会经常用到Block。特别是在多线程中,Block的用处更广泛。而且,Block不仅可以接收参数,其本身也可以作为参数,因此,Block的功能非常强大。简单介绍一些Block的使用。

首先看一个Block的简单定义:

BOOL (^isInputEven)(int) = ^(int input){
if(input % == ){
return YES;
}else{
return NO;
}
};

这样就定义了一个Block。Block有返回值,有参数,有名称,Block是以“^”符号开始的。Block本身就是一个代码段,提前定义好,当需要的时候直接调用即可。

使用上述定义的Block:

NSLog(@"even = %d",isInputEven());

使用非常简单。

Block还可以使用同一作用域的变量,也就是说可以使用Block外部的变量。

示例代码:

void testBlock1()
{
float price = 1.99;
float (^finalPrice)(int) = ^(int quantity){
return quantity * price;
};
int quantity = ;
NSLog(@"price is %f",finalPrice(quantity));
}

Block finalPrice是可以使用外部的变量 price的。

需要注意的是,在Block内部是不能修改变量值得,比如在Block内部写 price = 0.99,运行会发生崩溃。

外部变量的变化不影响Block内部的值。举例来说:

void testBlock2()
{
float price = 1.99;
NSLog(@"first price = %p",price);
float (^finalPrice)(int) = ^(int quantity){
NSLog(@"second price = %p",price);
return quantity * price;
}; price = 0.99;
NSLog(@"third price = %p",price); int quantity = ;
NSLog(@"price is %f",finalPrice(quantity));
}

在代码块外,price的值已经改变,而且price的值改变之后才使用了代码块,但是代码块中的变量并没有受到影响,代码块中price的值仍然是1.99。

原因,通过在不同的阶段打印price的地址可以发现,代码块中的price的地址和改变前和改变后的地址都是不一样的。也就是说,Block在声明的时候,就将用到的变量深拷贝了一份,因此,外部变量的改变不影响Block内部的变量。

如果想实现外部变量的改变能够影响Block内部变量,可以使用__block,示例如下:

void testBlock3()
{
__block float price = 1.99;
float (^finalPrice)(int) = ^(int quantity){
return quantity * price;
};
int quantity = ;
price = 0.99;
NSLog(@"price is %f",finalPrice(quantity));
}

外部变量改变,Block内部的变量同样改变。

在开发中,由于Block定义比较麻烦,通常会使用 typedef 处理一下,一方面写起来简便,另一方面,更符合写程序的习惯。

示例程序如下:

typedef int (^addOperation) (int a,int b);

void testBlock4()
{
addOperation operation;
operation = ^(int a,int b){
return a + b;
};
NSLog(@"sum = %d",operation(,));
}

这样看起来会简单很多。

Block可以作为方法的参数,比如数组、字典遍历时。举例如下:

void testBlock5()
{
NSArray *array = @[@"a",@"b",@"c"];
[array enumerateObjectsUsingBlock:^(id obj,NSUInteger idx,BOOL *stop){
NSLog(@"%@",obj);
}];
}

实际上,如果变量是可变类型的话,比如MutableArray,外部变量的变化是可以影响到Block内部的变量的。

示例代码如下:

void testBlock6()
{
NSMutableArray *array = [NSMutableArray array];
[array addObject:@"abc"];
void (^enumArray)() = ^(){
for(NSString *string in array){
NSLog(@"string = %@",string);
}
};
[array addObject:@"def"];
enumArray();
}

运行结果包括两个字符串,是 abc 和 def。

iOS开发Block的使用的更多相关文章

  1. iOS开发--Block

    iOS开发--Block 1.什么是Block,block 的作用 ui开发和网络常见功能实现回调,按钮的事件处理方法是回调方法以及网络下载后的回调处理 (1)按钮 target-action   一 ...

  2. iOS开发——Block详解

    iOS开发--Block详解 1. Block是什么 代码块 匿名函数 闭包--能够读取其他函数内部变量的函数 函数变量 实现基于指针和函数指针 实现回调的机制 Block是一个非常有特色的语法,它可 ...

  3. ios开发 block语句块

    ios开发 block语句块 1.block 理解为匿名函数 2.block变量的定义 //定义block变量,^表示定义block //技巧:函数名左右加括号,在函数名前面在加^ void (^bl ...

  4. iOS开发-Block回调

    关于Block之前有一篇文章已经写过一篇文章Object-C-代码块Block回顾,不过写的比较浅显,不能体现出Block在实际开发中的重要性,关于Block的基础知识,可以参考之前的博客.在实际开发 ...

  5. IOS开发 Block的学习

    苹果公司正在大力推广Block块语法的使用,据说Block会迟早取代一般协议代理的使用. Block最大的作用是函数回调,简化代码. 在ios中,将blocks当成对象来处理,它封装了一段代码,这段代 ...

  6. iOS开发-block使用与多线程

    Block Block封装了一段代码,可以在任何时候执行 Block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值. 苹果官方建议尽量多用block.在多线程.异步任务.集合遍历. ...

  7. iOS开发 -------- Block技术中的weak - strong

    一 Block是什么? 我们使用^运算符来声明一个Block变量,而且在声明完一个Block变量后要像声明普通变量一样,后面要加; 声明Block变量 int (^block)(int) = NULL ...

  8. IOS开发Block详细用法

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

  9. iOS开发——Block使用小结

    Block语法看上去好像很特别,但它实际上是作为极普通的C语言源代码处理的.Block的实质,就是Objective-C的对象. 1.Block的语法 ^ 返回值类型 参数列表 表达式 可省略返回值类 ...

随机推荐

  1. android 页面滑动 ViewFlipper,OnGestureListener,OnTouchListener

    public class Main extends Activity implements OnGestureListener, OnTouchListener { // 一般不直接使用ViewAni ...

  2. Android-xUtils框架介绍(二)

    昨天对xUtils整体上做了一个简单的介绍,今天咱们就代码码起,真刀实枪的也看看,看看如何快速便捷的把xUtils给集成到大家的项目中去.xUtils中有四大组件可以供我们使用,分别是ViewUtil ...

  3. bzoj1934 bzoj2768

    最小割的经典模型,体现出最小割的基本定义,把两个集合划分的最小代价 把一开始同意的人连源点,不同意的连汇点,有关系的人之间连边,流量都为1 不难发现,割两点(人)间的边就相当于朋友之间发生冲突 割到连 ...

  4. 比较const ,readonly, stitac readonly

    比较const ,readonly, stitac readonly: const和readonly的值一旦初始化则都不再可以改写: const必须在声明时初始化:readonly既可以在声明时初始化 ...

  5. hdu4177:Super Mario

    主席树+离散化.给一段区间.多次询问[l,r]中有多少个数小于k.啊主席树用指针版写出来优美多了QAQ... #include<cstdio> #include<cstring> ...

  6. Azure HDInsight与Hadoop周边系统集成

     Sunwei 9 Dec 2014 1:54 AM 传统的Hadoop系统提供给用户2个非常优秀的框架,MR计算框架和HDFS存储框架,尽管MR已经显得有些老迈而缓慢,但是HDFS还是很多应用系统的 ...

  7. ssh-keygen+ssh-copy-id 在linux下实现ssh无密码登录访问

    环境: 192.168.2.10 192.168.2.11 实现:2.10 ssh无需密码登录到2.11 在2.10 ssh到2.11机器上,需要密码,这样对一些脚本工作不方便,因为需要密码,也就是需 ...

  8. 在cshtml页面中,以‘@’开始的表达式 表示C#语句,会被编译执行

    在原始的Index.html中是正常显示的,然而在现在这个源代码是个cshtml页面: 但是在cshtml页面中,以‘@’开始的表达式 表示C#语句,会被编译执行,会去寻找controller传度给@ ...

  9. Spring 教程(一)

    一.Spring是什么 通常说的Spring其实指的是Spring Framework,它是Spring下的一个子项目,Spring围绕Spring Framework这个核心项目开发了大量其他项目, ...

  10. MySQL InnoDB存储引擎中的锁机制

    1.隔离级别 Read Uncommited(RU):这种隔离级别下,事务间完全不隔离,会产生脏读,可以读取未提交的记录,实际情况下不会使用. Read Committed (RC):仅能读取到已提交 ...