黑马程序员--OC Bolck笔记

  ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------


1    block的使用方法

块的语法格式如下:
^ [块返回值类型] (形参1,形参2,...)    

}
块必须以^开头,返回值类型通常都被省略,如果没有形参,建议使用void作为占位符。 
如果程序需要多次调用已经定义的块,那么应该將块赋值给一个块变量,定义块变量的语法格式如下  
块返回值类型 (^块变量名) (形参类型1,形参类型2,...); 
定义块变量时,不需要声明形参名,只需要指定形参类型。类似的,如果块变量不需要形参,建议使用void作为占位符。 
//main.c   
int main()  
{  
    // 如果block没有形参,可以省略后面的(),块变量后面的()不能省略  
    void (^myblock)() = ^{  
        NSLog(@"----------------");  
        NSLog(@"----------------");  
    };  
    // 利用block变量调用block内部的代码  
    myblock();   
   // 有返回值、有形参的block  
    int (^sumblock)(int, int) = ^(int a, int b){  
        return a + b;  
    };    
    int c = sumblock(1,2);     
    return 0;  
}   


2    block与局部变量
块可以访问局部变量的值,当块访问局部变量的值时,不允许修改局部变量的值。给局部变量加上__block关键字,这个局部变量就可以在block内部修改。 
//main.c   
int main()  
{  
    int a = 10;  
    __block int b = 20;  
    void (^block)();   
    block = ^{  
        // block内部可以访问外面的变量  
        NSLog(@"a = %d", a);   
        // 默认情况下,block内部不能修改外面的局部变量  
        // a = 20;   
        // 给局部变量加上__block关键字,这个局部变量就可以在block内部修改  
        b = 25;  
       NSLog(@"b = %d", b);  
    };   
    block();   
    return 0;  
}   

3 掌握block的知识点


Block 是iOS在4.0之后新增的程式语法,
1、用法:用来保存一段代码
2、标志:^
3、block跟函数很像:
     1)可以保存代码
     2)有返回值
     3)有形参
     4)调用方式一样 

4  如何定义block变量 

//int为返回值,参数为两个int类型的sumBlock的 block  
int (^sumBlock)(int, int);  
//无返回,无参数的myBlock的 block代码  
void (^myBlock)(); 

 5   如何利用block封装代码

 
//1)带有两个int类型的参数a、b  
^(int a, int b) {   
    return a - b;  
 };   
//2)无参的代码形式,无参括号可以省略  
 ^() {  
    NSLog(@"----------");  
 };  
//无参括号可以省略  
 ^ {  
    NSLog(@"----------");  
 };  

 

6   利用typedef定义block类型


typedef int (^MyBlock)(int, int);  
// 以后就可以利用MyBlock这种类型来定义block变量  
MyBlock block;  
MyBlock b1, b2;   
b1 = ^(int a, int b) {  
   return a - b;  
};   
MyBlock b3 = ^(int a, int b) {  
   return a - b;  
};   


7  代码示例(重点掌握block对方法块的封装,增强代码可读性)

 
#import <Foundation/Foundation.h>  
  
//利用typedef定义block类型,以后就可以利用MyBlock这种类型来定义block变量  
typedef int (^MyBlock)(int, int);  
  
int main(){  
    //定义一个MyBlock类型的sumBlock  
    MyBlock sumBlock;  
  
    //sumBlock代码块的实现,加法返回a+b的值  
    sumBlock = ^(int a, int b) {  
        return a + b;  
    };  
      
    //同理实现减法  
    MyBlock minusBlock = ^(int a, int b) {  
        return a - b;  
    };  
      
    //同理实现乘法  
    MyBlock multiplyBlock = ^(int a, int b) {  
        return a * b;  
    };  
  
    //使用代码块,打印输出  
    NSLog(@"%d - %d - %d", multiplyBlock(2, 4),  sumBlock(10 , 9), minusBlock(10, 8));  
       
    return 0;  
}  


Block 封装了一段代码,可以在任何时候执行
Block可以作为函数参数或者函数的返回值,而起本身又可以带输入参数或返回值
多用于 多线程、异步任务、集合遍历、集合排序、动画转场等
block总结:
1.>定义block变量:
int (^sumBlock)(int ,int);
void (^myBlock)();
2.>利用block封装代码
^(int a,int b){
return a - b;
}
^{
NSLog(@"");
}
3.>block访问外部变量
block 内部可以访问外面的变量
默认情况下,block内部变量不能修改外面的局部
给局部变量加上__block关键字,这个局部变量就可以在block内部修改
4.>利用typedef定义block类型
typedef int (^MyBlock)(int,int);

test3:利用typedef 简化声明定义block
 
typedef int (*SumP)(int,int);  
typedef int (^MyBlock)(int,int);  
int sum(int a,int b){  
    return a+b;  
}  
void test4(){  
    SumP p = sum;  
    SumP p2 = sum;  
    MyBLock = sumBlock;  
    sumBlock = ^(int a,int b){  
        return a+b;  
    };  
    MyBlock = minusBlock(^int a,int b){  
        return a-b;  
    };  
    NSLog(@"%d - %d",sumBlock(10,9),minusBlock(10,5));  
}   


test3:block修改外部的变量
 
 void test3(){  
    int a = 10;  
    __block int b = 20;  
    void (^block)();  
    block=^{  
        //block 内部可以访问外面的变量  
        NSLog(@"a = %d",a);  
        //默认情况下,block内部变量不能修改外面的局部  
        a = 20;//这是不可以的  
        //给局部变量加上__block关键字,这个局部变量就可以在block内部修改  
        b = 25;  
    };  
    block();  
}

test2:有返回值,有形参的block
 
void test(){  
    int (*sumpoint)(int,int) = sum;  //可以对比一下  
    int d = p(10,13);  
  
  
    int (^sumblock)(int,int)=^(int a,int b){  
        return a+b;  
    }  
    int c = sumblock(10,11);  
    NSLog(@"%d",c);  
  
  
    void (^lineBlock)(int) = ^(int n){  
        for(int i=0;i<n;i++){  
            NSLog(@"----------------");  
        }  
    };  
    lineBlock(5);//输出五条线  
    return 0;  
}  



//test1:没有返回值,没有形参的block

void test1(){  
    //block 用来保存一段代码  
    //block的标志: ^  
    /* 
    block跟函数很像: 
    1.可以保存代码 
    2.有返回值 
    3.有形参 
    4.调用方式一样 
    */  
    //定义block变量  
    void (^myblock)() = ^{  /^()  可以省略括号  
        NSLog(@"----------");  
        NSLog(@"----------");  
    };  
    //利用block变量调用block内部的代码  
    myblock();  
    //int a = 10;相似  
    return 0;  
}  



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值