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. Python爬虫基础示例

    使用pip安装相关依赖: pip install requests pip install bs4 安装成功提示:Successfully installed *... 爬取中国天气网数据示例代码: ...

  2. 以Append方式打开文件,设置偏移量无效

    #include<stdio.h> int main() { FILE * fd = fopen("btoo1.c", "ab+"); fpos_t ...

  3. POJ3904 Sky Code【容斥原理】

    题目链接: http://poj.org/problem?id=3904 题目大意: 给你N个整数.从这N个数中选择4个数,使得这四个数的公约数为1.求满足条件的 四元组个数. 解题思路: 四个数的公 ...

  4. Spring官方文档翻译——15.4 处理器映射(Handler mappings)

    15.4 处理器映射(Handler mappings) 注:以下将handler翻译成处理器 在Spring早先的版本号中,用户还须要在web应用上下文中定义处理器映射来配置请求(requests) ...

  5. Delphi的参数修饰const/var/output 与C++的对应关系

    delphi的const/input和默认的没有修饰, C++都是一样的 delphi的var,对应C++那边是指针,  调用方需要管理内存(负责分配内存及销毁) delphi的output , 对应 ...

  6. dotnet 命令的使用

    dotnet --info PS E:\GitHub\KerryJiang\SuperSocket> dotnet --info.NET Command Line Tools (2.1.4) P ...

  7. 《Android编程权威指南》CriminalIntent项目梳理

    相信很多新手或者初级开发人员都已经买了第2版的<Android编程权威指南>, 这本书基于Android Studio开发,对入门人员来说是很好的选择,但是很可惜的是, 在完成一个项目后, ...

  8. 81.node.js前端html时页面格式错乱解决办法

    var http = require("http"); var url = require("url"); var fs = require("fs& ...

  9. Android 数据库框架总结,总有一个适合你!

    一:OrmLite 简述: 优点: 1.轻量级:2.使用简单,易上手:3.封装完善:4.文档全面.缺点:1.基于反射,效率较低(本人还没有觉得效率低):2.缺少中文翻译文档 jar包 地址:http: ...

  10. 分享一个js对象开发组件写法

    var TextCount = (function(){ //私有方法,外面将访问不到 var _bind = function(that){ that.input.on('keyup',functi ...