Block专题

来源:互联网 发布:混沌与秩序2救赎数据库 编辑:程序博客网 时间:2024/06/08 08:12
Block的作用很强大,熟练的掌握block的使用,在项目中进行类的封装时具有很大的优势,也能够节省很多时间,博主在此制作简单分析,各路仁兄,走过路过,请在小店休息片刻,关注博主的新浪微博:http://weibo.com/u/2990535753
1、block简单示例:
//一、在单个类中实现
    //1.声明—》》返回值类型(^block名)(参数类型1,参数类型2);
    int(^block1)(int,int);
    //2.实现—>>^(参数类型1 参数1,参数类型2 参数2){ … };
    block1 = ^(inta, int b){
       
returna +b;
    };
   
//3.调用
   
int result = block1(1,2);
    NSLog(@"result = %d", result);

//二、void类型的block
   
//1.声明
   
void(^block2)();
   
//2.实现
   
/*实现方法1
     block2 = ^{
        //...
     };
     */

   
   
//实现方法2
    block2 = ^(){
       
NSLog(@"空类型block");
    };
   
//3.调用block
    block2();

//三、定义block类型
     //定义block类型
     -->>返回值类型(^block类型)(参数类型1,参数类型2);
     typedefint(^SumBlock)(int,int);
     //1.声明block
     SumBlocksumBlock;
     //2.实现
     sumBlock = ^(inta, intb){
     returna + b;
    };
   
//3.调用
   
int result = sumBlock(1,2);
    NSLog(@"%d", result);

2.block作为参数
//、整型返回值block做参数
TestViewController.h文件中
//整型返回值block-->>(返回值类型(^)(参数类型1,参数类型2))block
//1.声明
- (int)testBlock1:(int(^)(int,int))block;

TestViewController.m文件中
//实现方法
- (
int)testBlock1:(int(^)(int,int))block
{
   
//3.调用block
   
intresult = block(1,2);
   
returnresult;
}
ViewController.m文件中
TestViewController*testVC = [[TestViewControlleralloc]init];
    //2.调用方法,实现block—》实现block时,参数要给定形参变量
    int result =  [testVCtestBlock1:^int(inta, intb) {
       
returna + b;
    }];
    NSLog(@"result1 = %d", result);

//、空类型block做参数
TestViewController.h文件中
//空类型block—>>(返回值类型(^)())block名;
//1.声明
- (void)testBlock2:(void(^)())block;
TestViewController.m文件中
//实现方法
- (void)testBlock2:(void(^)())block
{
   
//3.调用block
    block();
}
ViewController.m文件中
   TestViewController *testVC = [[TestViewController alloc]init];
   
//2.实现block
    [testVC
testBlock2:^{
       
NSLog(@"voidblock实现");
    }];

//、定义block类型 做参数

TestViewController.h文件中
//定义block类型
typedefint(^TestBlock)(int,int);
//block类型
- (void)testBlock3:(TestBlock)testBlock;
TestViewController.m文件中
//实现方法
- (void)testBlock3:(TestBlock)testBlock
{
   
//3.调用block
   
int result = testBlock(2,3);
   
NSLog(@"result = %d", result);
}
ViewController.m文件中
    TestViewController*testVC = [[TestViewControlleralloc]init];
   
//2.实现block
    [testVC
testBlock3:^int(inta, int b) {
       
return a + b;
    }];

3.block修改局部变量
//block引用局部变量
- (
void)blockConst
{
   
__blockint a = 10;
   
//1.声明
   
void(^block)();
   
//2.实现
    block = ^(){
       
//block改变局部变量必须在局部变量声明前加上_ _block
        a =
20;
       
NSLog(@"a = %d", a);
    };
   
//3.调用
    block();
}
4.block引用局部变量和实例变量的引用计数问题,引用计数都会在原来基础上+1
- (void)blockCount
{
   
//引用计数为1
   
__blockNSObject *obj = [[NSObjectalloc]init];
   
//1.声明
   
void(^block)();
   
//2.实现
    block = ^(){
       
//MRC中,obj此时引用计数为2block调用引用计数加1
//        NSLog(@"%ld", obj.retainCount);
       
NSLog(@"obj = %@", obj);
    };
   
//3.调用
    block();
}




0 0