文档章节

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.4K
5
10个优秀Objective-C和iOS开发在线视频教程

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

mingxun
2014/05/09
197
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
482
0

没有更多内容

加载失败,请刷新页面

加载更多

Experts say the weaker pound is drawing investors to the UK tech sector

UK tech companies secured a record £5.5bn in foreign investment in the first seven months of this year, research shows. This was more than the amount invested per capita in th......

wowloop
18分钟前
5
0
Add support for Android 9-patch images in BorderImage

The 9-patch image implementation in Qt Quick Controls 1 is an internal implementation detail of the Android style. It cannot handle .9.png image files out of the box, but takes ......

shzwork
23分钟前
4
0
c/c++日期时间处理函数小结

日期时间处理函数: 日期时间转为字符串 strftime/std::put_time 字符串解析成日期时间 strptime/std::get_time 时间结构转换:time_t->tm localtime:time_t->tm 时间结构转换:tm->time_t ...

chuqq
27分钟前
5
0
Apache Flink 进阶入门(二):Time 深度解析

前言 Flink 的 API 大体上可以划分为三个层次:处于最底层的 ProcessFunction、中间一层的 DataStream API 和最上层的 SQL/Table API,这三层中的每一层都非常依赖于时间属性。时间属性是流处...

大涛学长
28分钟前
3
0
创龙基于Xilinx Artix-7系列FPGA处理器

SOM-TLA7是一款由广州创龙基于Xilinx Artix-7系列FPGA自主研发的核心板,可配套广州创龙Artix-7开发板使用。核心板尺寸仅70mm*50mm,采用沉金无铅工艺的10层板设计,专业的PCB Layout保证信号...

Tronlong创龙
34分钟前
5
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部