博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Block代替delegate,尽量使用block,对于有大量的delegate方法才考虑使用protocol实现.
阅读量:4971 次
发布时间:2019-06-12

本文共 1795 字,大约阅读时间需要 5 分钟。

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

你可能感兴趣的文章
centos iptables
查看>>
unity3d 移动与旋转 2
查看>>
寻找二叉查找树中比指定值小的所有节点中最大的那个节点
查看>>
如何设置输入框达到只读效果
查看>>
RT3070 USB WIFI 在连接socket编程过程中问题总结
查看>>
MIS外汇平台荣获“2013年全球最佳STP外汇交易商”
查看>>
LeetCode 题解之Add Digits
查看>>
hdu1502 , Regular Words, dp,高精度加法
查看>>
20120227_CET6
查看>>
SpringBoot在idea中的热部署配置
查看>>
MyEclipse连接SQL Server 2008数据库的操作方法
查看>>
leetcode【67】-Bulb Switcher
查看>>
JS验证图片格式和大小并预览
查看>>
laravel5.2 移植到新服务器上除了“/”路由 ,其它路由对应的页面显示报404错误(Object not found!)———新装的LAMP没有加载Rewrite模块...
查看>>
编写高质量代码--改善python程序的建议(六)
查看>>
windows xp 中的administrator帐户不在用户登录内怎么解决?
查看>>
接口和抽象类有什么区别
查看>>
Codeforces Round #206 (Div. 2)
查看>>
Mycat分表分库
查看>>
模板的文件名和方法名一定要一致!!
查看>>