Objective-C 基础知识之(十一):Block

来源:互联网 发布:网络推广要什么证书 编辑:程序博客网 时间:2024/05/16 14:19

Block

       

1、block定义

block的本质:匿名函数

标志:托字符 ^

定义block三部分:返回值类型 参数列表 block实现体

       

例1:定义block,实现输出 Hello orld

无返回值无参数

^ void (){

    NSLog(@"Hello World");

};

       

2:定义block,返回两个整数的和

^ int (int a, intb){

    return a + b;

};

       

2、定义block的语法

^ 返回值类型 (参数列:参数类型,参数名){

    类似于函数体

   如果block有返回值,需要return语句

};

 

3、block的使用

       

block是匿名函数,不能像函数一样通过函数名调用。

block可以声明 类似函数指针的block变量,通过block变量调用定义的block。

定义block变量操作时,要保证类型一致

       

定义block,实现输出 Hello orld      

void (^sayHiBlock)()= ^ void (){

    NSLog(@"Hello World");

};

sayHiBlock();

       

定义block,返回两个数的最大值

int (^maxBlock)(int,int) = ^ int (int a, int b){

    return a > b ? a : b;

};

NSLog(@"%d",maxBlock(3,5));

       

定义block,传入一个字符串,返                                               回对应的整型数

int(^strBlock)(NSString *) = ^ int (NSString * inputStr){

    return [inputStr intValue];

};

NSLog(@"%d",strBlock(@"123"));

       

定义block,传入两个字符串,返回拼接后的字符串

NSString *(^appendBlock)(NSString *, NSString *) = ^ NSString * (NSString * str1, NSString* str2){

    return [str1 stringByAppendingString:str2];

};

NSLog(@"%@",appendBlock(@"mei", @"loveyou"));

       

       

4、便捷方式

block的定义部分,返回值类型可以省略不写。如果无参数则参数也可以省略不写。声明部分不能省。

void (^sayHiBlock)()= ^ {

    NSLog(@"Hello Word");

};

sayHiBlock();

       

int(^strBlock)(NSString *) = ^ (NSString * str){

    return [str intValue];

};

NSLog(@"%d",strBlock(@"123"));

       

       

5、block与变量的修改和读取

 

1 block与自己内部定义的局部变量:可以修改、读取

2 block与外部定义的局部变量:只能读取,不能修改

3 使用__block修饰的外部定义的局部变量,可以修改、读取

4 block与静态局部变量:可以修改,可以读取       

5 block与全局变量:可以修改,读取

 

全局静态变量 全局指的是作用域;静态指的是存储区域。

       

在oc中定义、使用block,是为了实现函数回调。

将block作为方法的参数,传给对象。对象内部负责调用block,在对象的外部定义(实现)block。

 

6、使用typedef给block类型重定义

定义block时不需要返回值类型。

返回两个整型数的最大值

typedefint(^maxBlock)(int, int);

 

传入两个字符串 返回拼接后的字符串

typedef NSString*(^appendBlock)(NSString *, NSString *);

 

maxBlock block1 = ^(int x, int y){

    return x > y ? x : y;

};

       

NSLog(@"%d",block1(3, 5));

       

appendBlock block2 =^ (NSString * str1, NSString * str2){

    return [str1 stringByAppendingString:str2];

};

NSLog(@"%@",block2(@"mei", @"loveyou"));



0 0
原创粉丝点击