OC06 Block

来源:互联网 发布:nfc读卡软件 编辑:程序博客网 时间:2024/05/29 13:40

//  OC06 Block、数组高级

#import <Foundation/Foundation.h>


#pragma mark -block变量类型的重命名方法

// block变量类型的重命名:方法和函数指针类型重命名一样

// 将有一个整形返回值和两个整形参数的函数类型,取了一个新名字:MYBLOCK


typedefint(^MYBLOCK) (int,int);

//typedef int(^kMyBlock) (int, int); // 也可用驼峰命名法命名


int c =11;


int main(int argc,const char * argv[]) {

#pragma mark -Block语法

   /*

     1、在C语言中,我们可以使用函数指针指向一个函数,这样我们就能通过函数指针来调用这个函数。(将函数名交给函数指针)

     2、如果函数没有函数名,也就是匿名函数。匿名函数在C中是不合法的,也无法直接调用或通过指针调用。但是,在OC中,我们可以通过Block变量来保存这个匿名函数,在之后合适的地方通过Block变量名来调用这个函数

     */

    

    #pragma mark --定义一个block变量

    // 定义block变量的方法和定义函数指针的方法一样,唯一不同的是,函数指针使用*block变量使用^将后边的字符声明为block变量名。

   int (^myBlock)(int,int);

    

    #pragma mark --将同类型的函数(匿名函数)赋值给block变量

   /*

     ^int (int a, int b)

     1"^"将函数声明为block变量的值,如果没有托字符,则这个函数无法赋给block变量

     2、匿名函数的返回值类型可以省略,但是参数类型和参数的名字不能省略

     */

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

       return a + b;

    };

    

    #pragma mark --调用block变量

   /*

     调用block变量方法和调用函数指针、函数名的方法一样,通过变量名来调用,如果有参数,需要向代码块中传递参数

     */

   int result = myBlock(12,23);

   NSLog(@"%d", result);

    


    

    //练习1:写一个返回值为整型参数为OC字符串(仅一个参数)block,实现将字符串转换为整型的功能。

    // 1、声明block变量

   int (^block1)(NSString *str);

    // 2、调用

    block1 = ^int (NSString *str ){

        return [strintValue]; //  intValue方法:将字符串转换为整形

    };

   NSLog(@"%d", block1(@"1213"));

    

    

#pragma mark -使用typedef之后的新类型名定义一个block变量

   MYBLOCK block = ^(int a,int b){

       return a * b;

    };

   NSLog(@"%d",block(4,5));



#pragma mark -block中使用变量

   /*

     block内部可以访问局部变量和全局变量,但是只能修改全局变量,如果想修改局部变量,需要在局部变量前使用__block来修饰。

     */

    __blockint a = 10;// 使用__block修饰的局部变量可以在block内部被修改

   void (^demo)() = ^(void){

       NSLog(@"a = %d", ++a);

        NSLog(@"c = %d", ++c);// 因为c是全局变量,所以可以直接在block内部被修改

    };

    demo();

    

    

    

    

    

    

   return 0;

}

0 0
原创粉丝点击