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


    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]; 

        }];

  • 相关阅读:
    iOS 代码块
    前端模拟接口工具推荐—Apifox(mock数据)
    解决:Inferred type 'E' for type parameter 'E' is not within its bound
    vue 跨行
    MYSQL_DATE_FORMAT()_函数_详解
    docker: no matching manifest for windows/amd64 10.0.19044 in the manifest list entries.
    logback.xml引用spring的配置变量,日志配置引用配置变量
    idea将多次提交合并;idea将git多次提交合并
    windos将docker数据移到D盘
    docker在windos上启动错误
  • 原文地址:https://www.cnblogs.com/YangFuShun/p/5477301.html
Copyright © 2020-2023  润新知