IOS-Block编程

IOS学习之十八:学习的细节之Block编程

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做为代码或者是编程上一些进阶,可能因为习惯关系还是比较少用到它,甚至我问了一个朋友,居然说,没怎么听说过~

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值