今天网上找了些资料学习iOS Block,大部分都讲得很零散,且有些晦涩,有一篇个人觉得还不错,比较清楚,但也算是入门级别的,转载下来,留着以后复习。
================================================================================================================
IOS block 教程
基本就一句话,交代了Block在4.0后被引入,以及我们为什么要学习它的一个理由~
二:基本语法
Block可以看成一个语句块或者是很多时候当做匿名函数来使用。
- (void)animateWithDuration:(NSTimeInterval)duration animations:(void (^)(void))animations __OSX_AVAILABLE_STARTING(__MAC_NA,__IPHONE_4_0); // delay = 0.0, options = 0, completion = NULL
- [ UIView animateWithDuration:10 animations:^{
- NSLog(@"%@,",@"block");
- }];
简单以这句函数来看。
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之间的互动:
- 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: }
这段例子简单易懂。
5.对于block语句块内引用实例变量的计数器+1问题以及处理方法。这个也算是注意点,以及一些冷门面试题会出的问题。
6.因为受限制于sdk的问题,对于代码版本中使用新特性block后要对前面系统的支持,可能需要用
NS_BLOCKS_AVAILABLE来做判断和代码适配。
7.个人感觉,block做为代码或者是编程上一些进阶,可能因为习惯关系还是比较少用到它,甚至我问了一个朋友,居然说,没怎么听说过~
但是作为代理或是回调的另一种实现方式替代方式,也算是可以慢慢用之然后接受的。
(转自:http://blog.csdn.net/nono_love_lilith/article/details/7934352)