黑马程序员---OC学习笔记之block的基本概念

------Java培训、Android培训、iOS培训、.Net培训--------

、block的基本概念

1)block对象是一个C级别的语法和运行机制,它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据。这些数据在程序执行时用于对行为产生影响。

 

2)你可以用block来写一些可以传到API中的函数语句,可选择性的存储,并可以使用多线程,作为一个回调,block特别的游泳,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。

 

3)由于objective-C和C++都是衍生自C,block被设计为可同时兼容这三种语言

 

2、block的基本用法

 

用【^】操作符来表明一个block变量,并指明block语句的开始,block的主题部分包含在【{}】内,像下面的例子中一样.

 

3、应用举例

 

 

//1、有参有返回值
        int (^blockName1)(int,int) = ^(int num,int a){
            return num*a;
       };
        //2、无参无返回值,bolck名后的()为空
        void (^blockName2)() = ^(){
            NSLog(@"blockName2 :Iam amos");
       };
        //3、有参无返回值
        void (^blockName3)(NSString*) = ^(NSString* str){
            NSLog(@"blockName3:value = %@",str);
       };
        //4、无参有返回值
        NSString* (^blockName4)() = ^{
            return @"blockName4";
       };
        //5、block变量的使用
        NSLog(@"blockName1value = %d",blockName1(2,5));
       blockName2();
        blockName3(@"I am 24 years old");
        NSLog(@"%@",blockName4());
       
        //6、以上都是先定义一个变量同时赋值,其实一个block就相当于一个变量
        //也可以先定义再赋值,如下
        blockName1 = ^(int a, int b){
            int m = a > b ? a : b;
            NSLog(@"max = %d", m);
            return m;
       };
        blockName1(2,5);

打印结果:

2015-10-07 14:05:47.335分类扩展[1154:303] blockName1value = 10

2015-10-07 14:05:47.337分类扩展[1154:303] blockName2 :Iam amos

2015-10-07 14:05:47.338分类扩展[1154:303] blockName3:value = I am 24 years old

2015-10-07 14:05:47.339分类扩展[1154:303] blockName4

2015-10-07 14:05:47.339分类扩展[1154:303] max = 5

 

【结果分析】

从上述例子可以看出,可以很方便的给block变量赋值,可以动态的绑定方法。


二、blocktypedef

1、函数指针

定义格式:

返回类型 (*函数指针名)(参数列表);

【技巧】

1)把函数的声明拷贝过来

2)把函数名换成 (*函数指针变量名)

3)形参名可以不写

 

【好处】

可以灵活的使用p调用不同的方法

【使用举例】

int add(int a, int b){
    return  a + b;
}
int sub(int a, int b){
    return a - b;
}
 
int main(int argc, const char * argv[])
{
    //定义一个函数指针
    int (*p)(int,int);//int (*p)(int a,int b);也行,可以省略参数名
    //给函数指针赋值
    p = add;
    //使用函数指针
    int c = p(1,2);
    NSLog(@"c = %d",c);
    //也可以这样使用
    p = sub;//使函数指针指向另一个方法
    c = (*p)(2,1);
     NSLog(@"c = %d",c);
    return 0;
}


打印结果:

2015-10-07 14:35:42.955加强02[1231:303] c = 3

2015-10-07 14:35:42.957加强02[1231:303] c = 1

【给函数指针取别名】

取别名格式:

typedef返回类型 (*新类型名)(参数列表);

【用别名定义函数指针格式】新类型名指针变量名;

上述代码可以有如下改动,其他不用变

//定义一个函数指针
    typedef int(*Func)(int,int);//int (*p)(int a,int b);也行,可以省略参数名
    //给函数指针赋值
    Func p= add;


 

2、block的typedef

【格式】

   typedef返回值类型 (^newBlockTypeName)(参数列表);

【例子】

   typedefint (^myBlock)(int,int);

【应用举例】

    

//【格式】typedef返回值类型 (^newBlockTypeName)(参数列表);
    //定义一个有参有返回值的block的别名
    typedef int (^myBlock)(int, int);
    //此时myBlock是一个类型,不再是一个单纯的变量了
    myBlock b1 = ^(int a, int b){
        return a + b;
   };
    NSLog(@"a + b = %d", b1(1,2));

 

打印结果:

2015-10-07 14:45:23.489加强02[1252:303] a + b = 3


三、blockOC类中的使用

1、block作为OC类成员变量

 

例如:

//无参的block作为OC对象的成员变量G
@property(nonatomic,copy) void (^myBlock)();
//有参的block作为OC对象的成员变量G
@property(nonatomic,copy) void (^myBlock2)(int a);
//无参有返回值的block作为OC对象的成员变量G
@property(nonatomic,copy) int (^myBlock3)();


 

2block作为方法的参数使用

//block作为方法的参数使用
-(void)show:(void (^)()) myBlock{
   myBlock();
}


也可以这样用

typedef void (^myBlock)();
 
//block作为方法的参数使用
-(void)show:(myBlock) mb{
   mb();
}



你可能感兴趣的:(Objective-C基础)