【iOS开发技术】Block的使用(一)

简介

虽然网上关于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以外的变量的时候我们有两种方式去使用

  1. 将这个变量传递到Block中去使用
  2. 直接使用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的简单介绍和使用就到这里。