简介
虽然网上关于Block的例子很多很多啊,但是我还是要自己总结一下。
Block是什么Block : 块在IOS开发中,Block=代码块.所有的代码,一段代码都可以称之为一个代码块,不仅仅是在IOS中.
Block有什么用Block的用处有很多.我基本都讲Block使用于回调,或者某个公共函数,但是需要执行不同的操作的时候.(例如延迟函数)Block在IOS开发中有许多的好处,这个可以参阅Apple官方的API
Block的简单使用
Block的调用和声明在IOS开发中Block的使用我们使用「^」来声明一个Block对象,下面是一个Block的例子:
void (^myBlock)(void)=^{
NSLog(@"Hello World");
};
这是一个很简单的Block的例子。我们来分解一下几句代码的意思。
void /*表示这个block的返回值*/
(^myBlock)/*myBlock 是申明的这个block的名称*/
(void)/*这个void表示传递进去的参数*/
=^{ /*这里是你要执行的代码*/ };
有参数的Block的声明通过上面这个简单的例子 我们就可以简单的写出一个有参数的的Block,加入我要写一个 a+b的Block 并且输出
void (^aPlusbBlock)(int,int)=^(int a,int b){
NSLog(@"%d",a+b);
};
Block中返回一个值若是我们的Block需要一个返回值的时候,我们就需要像下面酱紫写
int sum=0;
int (^aPlusbBlock)(int,int)=^(int a,int b){
return a+b;
};
sum=aPlusBlock(1,2);
通过这段代码 我们可以看出 调用一个Block的方法。
在Block中使用变量,以及改变一个变量的值当我们使用Block以外的变量的时候我们有两种方式去使用
- 将这个变量传递到Block中去使用
直接使用Block外面声明的变量←。 ← 其实我觉得我说了废话。不过在改变值的时候就会有点不一样了。传递到Block中的是形参当然是可以改变的,在Block外面的变量如果是想要在Block中操作需要加上 __block 去申明下面来看一段示例代码:
__block int sum=0; void (^aPlusbBlock)(int,int)=^(int a,int b){ sum=a+b; };
若是在上面这段代码中 我不加 __block 去声明的话是无法操作 sum 变量的
Block的一些技巧、以及注意事项
##使用typedef声明一个Block
typedef void (^BoolBlock) (BOOL);
/*接受BOOL参数,没有返回值的block */
typedef int (^IntBlock) (void);
/*没有参数,返回int的block*/
typedef BoolBlock (^OtherBlock) (IntBlock);
/*从这个Block的定义可以看出,一个Block可以是参数,同时也可以是一个返回值*/
//下面是例子~
IntBlock iBlock = ^(){ return 1; }; OtherBlock hBlock=^(IntBlock iii){
NSLog(@"aaa%d",iii());
BoolBlock bbbBlock =^(BOOL B){
NSLog(@"%hhd",B);
};
return bbbBlock;
};
hBlock(iBlock)(YES);
在某个方法中使用Block 作为参数这里我们需要注意一下 Block参数的申明方式了上面我们看到一个block的声明如下
void (^aPlusbBlock)(int,int)
但是在当作一个方法的参数使用的时候 我们必须如下书写方式
void (^) (int a, int b) aPlusbBlock
完整的写法就是酱紫
-(void) function:( void (^) (int a, int b) ) aPlusbBlock;
若是你要在一个类里面定义一个Block的property,就需要像下面酱紫定义
@property (nonatomic, copy)BoolBlock block;//这里必须用Copy,这个理由嘛,暂时我也不清楚,可以自己查一下
static修饰的Block大家知道static可以修饰一个静态变量,静态变量是可以全局调用的,当然Block也是可以的
static int(^maxIntBlock)(int, int) = ^(int a, int b){return a>b?a:b;};
像酱紫,我们就可以定义一个静态的Block了
总结
总结写什么呢 其实没什么好总结的,好像ios开发中鼓励多使用Block以及GCD。文档好像有提到的样子。Block的简单介绍和使用就到这里。