Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.

本文详细介绍了Objective-C中的Block使用方法,包括Block的基本语法、如何定义不同类型的Block、如何在方法中传递Block作为参数,以及如何解决Block引起的循环引用问题等关键知识点。

Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.

1.Block语法总结及示例如下:

        //1.普通代码块方式block

    returnType (^blockName)(parameterTypes) = ^returnType(parameters) {

 

        // block code

 

    };

    使用未例:

 

    int (^abc)(int a) = ^int(int a){

 

        return a+1;

 

    };

 

    int aa = abc(2);

 

    NSLog(@"%d",aa);



 

    //2.属性方式block

 

    @property (nonatomic, copy) returnType (^blockName)(parameterTypes);

    使用示例:

    1.定义属性

    @property (nonatomic,copy) int (^testblock)(NSString *);

         2.设置使用属性

         [self setTestblock:^int(NSString *a) {

 

        return 0;

 

    }];

 

 

 

    //3.方法参数block

 

    - (void)someMethodThatTakesABlock:(returnType (^)(parameterTypes))blockName {

 

        // block code

 

    };

    使用示例1:

    1.无参数型定义及实现:

    - (void)testBlockFun:(void(^)())completion{

     NSLog(@"执行");

 

        if (completion) { 

           completion();

        }

 

    }

    2.无参数型block调用:

    [self testBlockFun:^{

 

        NSLog(@"回调结束");

 

    }];

 

    使用示例2:

        1.带参数型定义及实现:

        - (void)testBlockFun:(int (^)(int a,int b))complate{

 

        if (complate) {

 

            int c = complate(3,5);

 

            NSLog(@"c:%d",c);

 

        }

 

    }

    2.带参数型block调用:

    [self testBlockFun:^int(int a, int b) {

 

        return a+b;

 

    }];

 

 

    // 4.作为参数

 

    [someObject someMethodThatTakesABlock: ^returnType (parameters) {

 

        // block code

 

    }];

    使用示例:

    1.定义及实现

    - (void) testBlockFun:(void (^)(NSString *))complate{

 

        if (complate) {

 

            complate(@"success");

 

        }

 

    }

    2.调用

    [self testBlockFun:^(NSString *str) {

 

       NSLog(@"str:%@",str);

 

   }];

 

 

    // 5.使用 typedef 定义

 

   typedef returnType (^TypeName)(parameterTypes);

 

 

   TypeName blockName = ^(parameters) { 

 

   };

   使用示例:

   typedef void (^blockTestName)(NSString *);

   调用:

   [self setName:^(NSString *a){

 

   }];

 

2.Block修改值:使用__block可以在block内部修改外部变量的值。

    __block int someIncrementer = 0;

 

   [someObject someMethodThatTakesABlock:^{

 

         someIncrementer++;

 

   }];

 

3.Block循环引用,block会持有对象,block的对象也有block,会造成block的循环引用,解决方法:

    __weak typeof(self) weakSelf = self;//@weakify(self); 

 

    [self someMethodThatTakesABlock:^{

 

        [weakSelf action]; 

 

    }];

转载于:https://www.cnblogs.com/YangFuShun/p/5477301.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值