文档章节

IOS--Block入门

Mark_Jiang
 Mark_Jiang
发布于 2016/01/07 14:31
字数 1083
阅读 42
收藏 1

Block介绍

  一:Block是一种具有匿名功能的内嵌函数,特性如下:

(1):如一般函数能拥有带有型态的参数

(2):拥有回传值

(3):可以获取和选择性地修改作用域的状态

 二:Block的使用

  Block可以简化代码块,适合用来建立一些同步执行的代码,封装一些小型的工作或是作为某项工作完成时的回传呼叫。


三:声明和创建Block;

(1)用^来声明变量:返回值/声明方法/参数

1: /* 回传void ,参数也是void 的block*/
   2: void (^blockReturningVoidWithVoidArgument)( void );
   3: /* 回传整数,两个参数分别是整数和字元型态的block*/
   4: int   (^blockReturningIntWithIntAndCharArguments)( int , char );
   5: /* 回传void ,含有10 个block 的阵列,每个block 都有一个型态为整数的参数*/
   6: void (^arrayOfTenBlocksReturningVoidWinIntArgument[ 10 ])( int );
   7: X.3.2 建立一个Block 
   8:  
   9: 我们使用「^」来开始一个block,并在最后使用「;」来表示结束,下面的范例示范了一个block变数,然后再定义一个block把它指定给block变数: 
  10:  
  11: int (^oneFrom)( int ); /* 宣告block 变数*/
  12:     /* 定义block 的内容并指定给上面宣告的变数*/
  13:     oneFrom = ^(int anInt)
  14:                 {
  15:                     return anInt = - 1 ; 
  16:                 };

(2)我们可以声明一个全局的block;

1: int GlobalInt = 0 ;
   2: int (^getGlobalInt)( void ) = ^ ( void ) { return GlobalInt ;};


四:Block的使用(初级)

 1: int multiplier = 7 ;
   2: int (^myBlock)( int ) = ^( int num)
   3: {
   4:     return num * multiplier;
   5: };
   6: printf ( "%d" , myBlock( 3 ));
   7: //结果会打印出21

  说明:

(1):声明一个myblock变量,用^符号表示这是一个block

 (2):表示myblock是一个返回值为 int 的block

   (3) : 他有一个参数,型态为整形,参数名为 num


   直接使用Block:多数情况下,我们并不需要声明block变量。我们可以直接在需要使用block的地方直接用内嵌的方式将block的内容写出来,直接将block作为它的参数;

1: char *myCharacters[ 3 ] = { "TomJohn" , "George" , "Charles Condomine" };
   2: qsort_b (myCharacters, 3 ,
   3:          sizeof ( char *),
   4:          ^( const void *l, const void *r)//block部分
   5:             {
   6:                 char *left = *( char **)l;
   7:                 char *right = *( char **)r;
   8:                 return strncmp (left, right, 1 );
   9:             }                            //end
  10: );

  备注:如果修改内容的block,在前面添加__block   int  name;


五:__block变量  若要内部可以访问修改不许添加关键字

 1: // 加上__block 修饰词,所以可以在block 中被修改。
   2: __block int x = 123 ;
   3: void (^printXAndY)( int ) = ^( int y)
   4:     {
   5:         x = x + y;
   6: printf ( "%d %d\n" , x, y);
   7:     };
   8: // 将会印出579 456
   9:     printXAndY( 456 );
  10: //x 将会变成 579;
  11: 下面我们使用一个范例来介绍各类型的变数和block之间的互动:
  12:
  13: extern NSInteger CounterGlobal;
  14: static NSInteger CounterStatic;
  15: {
  16: NSInteger localCounter = 42 ;
  17: __block char localCharacter;
  18: void (^aBlock)( void ) = ^( void )
  19:     {
  20:         ++ CounterGlobal ; //可以存取。
  21:         ++ CounterStatic ; //可以存取。 
  22: CounterGlobal = localCounter; //localCounter在block 建立时就不可变了。
  23:         localCharacter = 'a' ; //设定外面定义的localCharacter 变数。
  24:     };
  25:     ++localCounter; //不会影响的block 中的值。
  26:     localCharacter = 'b' ;
  27:     aBlock(); //执行block 的内容。
  28: //执行完后,localCharachter 会变成'a'
  29: }

六:Block的使用

  (1):声明一个block,直接使用block

1: int (^oneFrom)( int ) = ^( int anInt) {
   2: return anInt - 1 ;
   3:     };
   4: printf ( "1 from 10 is %d" , oneFrom( 10 ));
   5: //结果会显示:1 from 10 is 9
   6: float (^distanceTraveled)( float , float , float ) = ^( float startingSpeed, float acceleration, float time)
   7:     {
   8: float distance = (startingSpeed * time) + ( 0.5 * acceleration * time * time);
   9: return distance;
  10:     };
  11: float howFar = distanceTraveled( 0.0 , 9.8 , 1.0 );
  12: //howFar会变成4.9


(2):将block当作函数的参数

 1: char *myCharacters[ 3 ] = { "TomJohn" , "George" , "Charles Condomine" };
   2: qsort_b (myCharacters, 3 , sizeof ( char *),
   3:             ^( const void *l, const void *r)
   4:             {
   5: char *left = *( char **)l;
   6: char *right = *( char **)r;
   7: return strncmp (left, right, 1 );
   8:             } // 这里是block 的终点。
   9:             );
  10: // 最后的结果为:{"Charles Condomine", "George", "TomJohn"}


(3)将block当作方法的参数:我们可以像传递一般参数的方式传递block;

 1: // 所有的资料
   2: NSArray *array = [ NSArray arrayWithObjects : @"A" , @"B" , @"C" , @"A" , @"B" , @"Z" , @"G" , @"are" , @" Q" ,nil ];
   3: // 我们只要这个集合内的资料
   4: NSSet *filterSet = [ NSSet setWithObjects : @"A" , @"B" , @"Z" , @"Q" , nil ];
   5: BOOL (^test)( id obj, NSUInteger idx, BOOL *stop);
   6: test = ^ ( id obj, NSUInteger idx, BOOL *stop) {
   7: // 只对前5 笔资料做检查
   8: if (idx < 5 ) {
   9: if ([filterSet containsObject : obj]) {
  10: return YES ;
  11:               }
  12:       }
  13: return NO ;
  14: };
  15: NSIndexSet *indexes = [array indexesOfObjectsPassingTest :test];
  16: NSLog ( @"indexes: %@" , indexes);
  17: // 结果:indexes: <NSIndexSet: 0x6101ff0>[number of indexes: 4 (in 2 ranges), indexes: (0-1 3-4)]
  18: // 前5笔资料中,有4笔符合条件,它们的索引值分别是0-1, 3-4


© 著作权归作者所有

共有 人打赏支持
下一篇: 常用网站收藏
Mark_Jiang
粉丝 0
博文 10
码字总数 3333
作品 0
闸北
高级程序员
私信 提问
2018 iOS 面试题大全(补充完整版)

原文地址:2018 iOS 面试题大全 由于原作者并没有继续更新,这里我转过来继续更新下 这个栏目将持续更新--请iOS的小伙伴关注! 1、iOS 应用导航模式有哪些? 2、iOS 中持久化方式有哪些? 3、...

Theendisthebegi
2018/11/15
0
0
iOS 学习资料整理

视频教程(英文) Developing iOS 7 Apps for iPhone and iPad 斯坦福开放教程之一, 课程主要讲解了一些 iOS 开发工具和 API 以及 iOS SDK 的使用, 属于 iOS 基础视频 iPad and iPhone Applic...

拉偶有所依
2015/01/19
2.2K
4
10个优秀Objective-C和iOS开发在线视频教程

如果你自己开发iOS应用,你肯定会发现网上有很多资源。学习编程的一个最好的方法就是自己写代码,而开始写代码的最快的方式就是看其他人怎么写。我们从海量视频和学习网站中整理出了我们认为...

mingxun
2014/05/09
0
0
iOS与JS交互之WKWebView-WKUIDelegate协议

级别:★★☆☆☆ 标签:「iOS与JS交互」「WKWebView与JS交互」「WKUIDelegate」 作者: Xs·H 审校: QiShare团队 先解释下标题:“iOS与JS交互”。iOS指原生代码(文章只有示例),JS指前端...

QiShare
2018/09/03
0
0
iphone开发资源汇总

学习过程当中查找到的资料,做一个记录,以便更多朋友查看。 开发的过程有时候是简单的,因为我们可以站在巨人的肩上,跳得更高,走得更远。 如何用Facebook graphic api上传视频: http://d...

长平狐
2012/08/13
466
0

没有更多内容

加载失败,请刷新页面

加载更多

搜索引擎(Solr-索引详解)

时间字段类型特别说明 Solr中提供的时间字段类型( DatePointField, DateRangeField,废除的TrieDateField )是以时间毫秒数来存储时间的。 要求字段值以ISO-8601标准格式来表示时间:YYYY-MM...

这很耳东先生
23分钟前
0
0
Java成神之路

1、基础篇 01、面向对象 → 什么是面向对象 面向对象、面向过程 面向对象的三大基本特征和五大基本原则 → 平台无关性 Java 如何实现的平台无关 JVM 还支持哪些语言(Kotlin、Groovy、JRuby...

asdf08442a
53分钟前
2
0
dubbo源码分析-服务导出

简介 dubbo框架spring Schema扩展机制与Spring集成,在spring初始化时候加载dubbo的配置类。 dubbo服务导出的入口类是ServiceBean的onApplicationEvent方法 ServiceBean的继承关系如下 publ...

王桥修道院副院长
58分钟前
0
0
QQ音乐的动效歌词是如何实践的?

本文由云+社区发表 作者:QQ音乐技术团队 一、 背景 1. 现状 歌词浏览已经成为音乐app的标配,展示和动画效果也基本上大同小异,主要是单行的逐字染色的卡拉OK效果和多行的滚动效果。当然,我...

腾讯云加社区
59分钟前
4
0
idea里配置springboot项目打热部署

首先添加依赖 <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-devtools</artifactId> <optional>true</optional></dependency> 然后添......

shatian
今天
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部