现在的位置: 首页 > 综合 > 正文

block

2018年08月23日 ⁄ 综合 ⁄ 共 2344字 ⁄ 字号 评论关闭

IOS block 教程 

这是网上一篇介绍的挺详细的教程。


搜索过官方文档,蹩脚的英文面前看一点懂。速度很慢。
后来找到上面这片大部分文档的翻译,觉得挺好的。
对于block学习。大致分几点
1.sdk的限制,即,block属于哪个版本新引入的特性。
2.基本语法
3.情景使用。
一:block描述

Block 是iOS在4.0之后新增的程式语法,严格来说block的概念并不算是基础程式设计的范围,对初学者来说也不是很容易了解,但是在iOS SDK 4.0之后,block几乎出现在所有新版的API之中,换句话说,如果不了解block这个概念就无法使用SDK 4.0版本以后的新功能,因此虽然block本身的语法有点难度,但为了使用iOS的新功能我们还是得硬着头皮去了解这个新的程式概念。

基本就一句话,交代了Block在4.0后被引入,以及我们为什么要学习它的一个理由~

二:基本语法

Block可以看成一个语句块或者是很多时候当做匿名函数来使用。

  1. (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // delay = 0.0, options = 0, completion = NULL  

  1. [ UIView animateWithDuration:10 animations:^{  
  2.        NSLog(@"%@,",@"block");  
  3.     }];  

简单以这句函数来看。

animations参数接受一个block函数块。我们直接可以^{};来书写这个block。

然后看上面函数申明,我们看到animations接受的参数是这么申明的 (void(^)(void))animations;

这个也好理解,我们知道参数都需要一个申明一个类型比如

(NSTimeInterval)duration。(void(^)(void))其实就是block的一种常见格式的申明。里面还需要分为 :

第一个void是指的是block函数无返回,即{}执行玩没有返回值。(^)是固定规范,表明这是个block类型的。后面的()里表示block接受参数

当然,这边是(void)我们知道,不接受参数。

这边贴一张官方图

此图包含了申明和定义。

其实基本综合一下,我们要了解 三点

1.如何申明一个block函数

int(^testBlock)(int a,int b);

返回值类型 (^block名字)(传入参数)

2.OC申明一个带有block参数的函数

-(void)textF:(Bool (^)(id a,id b)) bBlock;

这个就如我们上面看到animations,基本和申明很类似,就是名称换到外面去了。

(返回类型 (^)(传入参数))block形参名

然后发现用C代码申明方法时:

void
dispatch_apply(size_t iterations, dispatch_queue_t queue, void (^block)(size_t));

3.申明后实现一个block函数块

^(int a,int b){

//code;

}

block基本语法就如上。

在使用block时几个重要点:

1.block函数外的对象,在block语句块内只有可读访问权限。

2.对外部对象进行__block申明解决了问题1.

3  各类型的变数和block之间的互动: 
 

  1. 13: extern NSInteger CounterGlobal;  
  2.  14: static NSInteger CounterStatic;  
  3.  15: {  
  4.  16: NSInteger localCounter = 42 ;  
  5.  17: __block char localCharacter;  
  6.  18: void (^aBlock)( void ) = ^( void )  
  7.  19:     {  
  8.  20:         ++ CounterGlobal ; //可以存取。  
  9.  21:         ++ CounterStatic ; //可以存取。   
  10.  22: CounterGlobal = localCounter; //localCounter在block 建立时就不可变了。  
  11.  23:         localCharacter = 'a' ; //设定外面定义的localCharacter 变数。  
  12.  24:     };  
  13.  25:     ++localCounter; //不会影响的block 中的值。  
  14.  26:     localCharacter = 'b' ;  
  15.  27:     aBlock(); //执行block 的内容。  
  16.  28: //执行完后,localCharachter 会变成'a'  
  17.  29: }  

这段例子简单易懂。

5.对于block语句块内引用实例变量的计数器+1问题以及处理方法。这个也算是注意点,以及一些冷门面试题会出的问题。

6.因为受限制于sdk的问题,对于代码版本中使用新特性block后要对前面系统的支持,可能需要用

NS_BLOCKS_AVAILABLE来做判断和代码适配。

7.个人感觉,block做为代码或者是编程上一些进阶,可能因为习惯关系还是比较少用到它,甚至我问了一个朋友,居然说,没怎么听说过~

但是作为代理或是回调的另一种实现方式替代方式,也算是可以慢慢用之然后接受的。

抱歉!评论已关闭.