1. block概念

block是ios4.0+和Mac osX 10.6以后引进的对C语言的拓展,用来实现匿名函数的特性。所谓匿名函数,也称闭包函数。即同意创建一个暂时的没有指定名称的函数。

最经经常使用作回调函数(callback)參数的值,当然也有其它使用方法。

比方说作为一个变量值来使用,详细使用方法将在后面介绍。

2. block定义:

在iOS中,使用脱字符“^”来声明一个block变量,block的内容包括在“{}”中的。而且和C语言一样用“。”来表示语句的结束。

详细定义例如以下图所看到的:

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxMzk1MDg1NA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/SouthEast" alt="">


1⃣️ 我们先来定义一个简单的。无返回值,无參数的block:

-(void)blockTestOne
{
void(^blockOne)(void) = ^(void){
NSLog(@"this is blockOne");
};
blockOne();
}

能够看到,上面的代码,我们是在一个函数blockTestOne里定义了一个无返回值,无參数的block,叫做blockOne。然后我们紧接着在后面调用了这个blockOne。

由于我们的block没有參数。所以在写的时候还能够简写成:

-(void)blockTestOne
{
void(^blockOne)(void) = ^{
NSLog(@"this is blockOne");
};
blockOne();
}

即省略了等号后面的參数列表。

控制台输出结果:

2⃣️接下来,我们定义一个有參数,无返回值的block:

-(void)blockTestTwo
{
void(^blockTwo)(int) = ^(int a){
NSLog(@"blockTwo == %d", a);
};
blockTwo(20);
}

在这里,我们定义了一个无返回值。參数类型为int型的block变量,名为blockTwo。然后我们调用了blockTwo,传入參数20,控制台打印结果为:


3⃣️然后,我们再来定义一个有返回值,而且有參数的block:

- (void)blockTestThree
{
int (^blockThree)(int) = ^(int b){
NSLog(@"blockThree parameter == %d", b);
return 10;
};
NSLog(@"%d", blockThree(20));
<h2>}</h2>

我们在这里定义了一个返回值为int型。而且參数为int型的block变量,然后block实现里面打印了他的參数,最后回返一个常量10;我们又在block打印了blockThree,而且给他传了个參数20。

控制台打印结果为:



在这里须要注意的是,由于我们定义的blockThree是有返回值的,所以当在他的实现中(即等号右边大括号中)。假设没有返回值return。编译器会直接给我们报错:


3. block的存储域。

看过我之前博客文章《block传值以及利用block封装一个网络请求类点击打开链接的朋友一定好奇,为什么利用block定义的属性,要用copy特性?如图:


在这里我们来分析一下block的存储域。大家就了解了。先看一段代码:
- (void)testBlock
{
void(^blockOne)(void) = ^{
NSLog(@"this is blockOne");
};
int c = 10;
void(^blockTwo)(void) = ^(void){
NSLog(@"this is blockTwo %d ", c);
};
void(^blockThree)(void) = [[blockTwo copy] autorelease];
NSLog(@"blockOne address == %@", blockOne);
NSLog(@"blockTwo address == %@", blockTwo);
NSLog(@"blockThree address == %@", blockThree);
}

在上面这段代码中,我们分别定义了三个block变量。blockOne,blockTwo和blockThree,然后,我们分别打印了他们三个的地址,他们三个的差别是,blockOne实现的不过打印一句话,没有使用不论什么外部变量(block定义以外的变量),而blockTwo实现的是打印了一句话。并写使用了一个外部变量c,而blockThree实现的是将blockTwo拷贝一分即copy一下,然后控制台打印的结果例如以下:





非常奇怪的能够看到,这三个block分别属于三个内存区域,blockOne由于没有使用不论什么外部变量,他的存储区域在全局区。而blockTwo由于使用了外部变量,则一下子跑到了stack区即栈区,而blockThree由于copy了blockTwo。则变到了堆内存中。我们都知道。在全局区和堆里面存储的对象是相对安全的,可是在栈区存储的对象就相对危急。有可能在使用他的时候其对象已经被释放,造成野指针,导致程序的crash。所以,我们在使用blcok的成员变量或者属性的时候,要将其copy到堆内存中使用。

未完待续。。

。还有__block的使用,记得关注哦。今天实在太晚了。


ios学习之block初探的更多相关文章

  1. IOS学习之block代码块

    前言: block这个名词对于做一般开发者来说可能会觉得稀奇古怪而非常陌生,但是对于iOS工程师来说,在整个开发中到处都是它的影子,今天一大早觉得在假期学习一下它,对明年的iOS开发工作做个准备,突然 ...

  2. IOS学习4——block代码块

    本文转载自:iOS开发-由浅至深学习block 一.关于block 在iOS 4.0之后,block横空出世,它本身封装了一段代码并将这段代码当做变量,通过block()的方式进行回调.这不免让我们想 ...

  3. ios学习笔记block回调的应用(一个简单的例子)

    一.什么是Blocks      Block是一个C级别的语法以及运行时的一个特性,和标准C中的函数(函数指针)类似,但是其运行需要编译器和运行时支持,从ios4.0开始就很好的支持Block. 二. ...

  4. iOS学习之block

    Block是C语言的扩充功能.带有自动变量(局部变量)的匿名函数.(不带有名称的函数) 非匿名函数:int func(int count):(声明了名称为func的函数)使用:int result = ...

  5. iOS 学习 - 9.Block 入门

    来自李明杰的视频. block 用来保存一段代码 block 的标志:^ block  跟函数很像: 1).可以保存代码  2).有返回值  3). 有形参 temp1:没有返回值.没有形参的 blo ...

  6. 原 iOS深入学习(Block全面分析)http://my.oschina.net/leejan97/blog/268536

    原 iOS深入学习(Block全面分析) 发表于1年前(2014-05-24 16:45)   阅读(26949) | 评论(14) 39人收藏此文章, 我要收藏 赞21 12月12日北京OSC源创会 ...

  7. 【原】iOS学习47之第三方-FMDB

    将 CocoaPods 安装后,按照 CocoaPods 的使用说明就可以将 FMDB 第三方集成到工程中,具体请看博客iOS学习46之第三方CocoaPods的安装和使用(通用方法) 1. FMDB ...

  8. iOS学习路线图

    一.iOS学习路线图   二.iOS学习路线图--视频篇       阶 段 学完后目标 知识点 配套学习资源(笔记+源码+PPT) 密码 基础阶段 学习周期:24天       学习后目标:    ...

  9. iOS学习笔记之ARC内存管理

    iOS学习笔记之ARC内存管理 写在前面 ARC(Automatic Reference Counting),自动引用计数,是iOS中采用的一种内存管理方式. 指针变量与对象所有权 指针变量暗含了对其 ...

随机推荐

  1. C#日期控件datetimepicker保存空值方法

    方法一(推荐): 设置datetimepicker的属性ShowCheckBox为true 在窗口初始化时候,添加代码this.datetimepicker1.Checked = false; 保存日 ...

  2. ArcGIS api for javascript——加载图标

    描述 这个示例展示了如何能用一个动画图片显示地图正在加载.在这个示例中,图片是一个小的动画GIF.当地图第一次加载或用户缩放和平移地图时显示图片.当所有图层加载完成图片消失. 这个示例是通过event ...

  3. C++函数指针相关 & 类成员的指针 & 成员函数的指针

    有时候会有指向类成员变量或者成员函数的指针,但是注意,这个指针并不是针对一个地址的指向,而更多的是一个偏移. 同时,支持将父类对象的成员 转为 子类对象的成员指针,如下: 反过来,是不行的.因为父类的 ...

  4. KVM硬件辅助虚拟化之 EPT in Nested Virtualization

    在嵌套虚拟环境(Nested Virtualization)下,执行在hypervisor上的Virtual Machine仍能够作为hypervisor去执行其他的Virutal Machine,而 ...

  5. c++动态库中使用命名空间的问题

    这是C++才会有的语言特性. 假如你使用一个程序库,他里面有桓霰淞拷衋bc,可是你自己也不小心定义了一个叫abc的变量,这样就会引起重定义错误.所以为了避免这样的现象,C++引入了名字空间(names ...

  6. 智课雅思短语---一、be no exception

    智课雅思短语---一.be no exception 一.总结 一句话总结:…也不例外? …be no exception 1.经济的快速发展? the rapid development of ec ...

  7. numpy 数据类型与 Python 原生数据类型

    查看 numpy 数据类型和 Python 原生数据类型之间的对应关系: In [51]: dict([(d, type(np.zeros(1,d).tolist()[0])) for d in (n ...

  8. 【实用篇】获取Android通讯录中联系人信息

    第一步,在Main.xml布局文件中声明一个Button控件,布局文件代码如下: <LinearLayout xmlns:android="http://schemas.android ...

  9. IDEA设置注释模板最佳实践

    效果 在方法上输入/**,然后按tab键,生成的效果如下 配置步骤 1. 在Live Templates中添加模板组,命名随意,主要是为了存放自定义的模板,方便管理 2. 在模板组下添加一个模板,具体 ...

  10. NET 高效开发之不可错过的实用工具(第一的当然是ReSharper插件)

    工欲善其事,必先利其器,没有好的工具,怎么能高效的开发出高质量的代码呢?本文为 ASP.NET 开发者介绍一些高效实用的工具,包括 SQL 管理,VS插件,内存管理,诊断工具等,涉及开发过程的各个环节 ...