zoukankan      html  css  js  c++  java
  • block

    • block方法和代理是可以互换的。

    block只能用copy,用strong是没用的:

    @property (nonatomic, copy) void (^hideBlock)();// 没有返回值,没有参数

    @property (nonatomic, copy) void (^setTitleBlock) (NSString *title);// 没有返回值,带参数

    @property (nonatomic, copy) NSString *(^getTitleBlock)();// 返回值是字符串

    block里面不能用self,要先转成weak

    copy状态下的block(堆里面的block)会对block里面使用的外部变量 强 引用,造成内存泄露。因为循环引用,见下图。解决方法是将block代码中,用的外部变量(self)先赋值给一个声明为weak的变量,之后再block代码中用这个weak变量。__weak ILsSettingViewController *setting = self;

    // 此处的void,代表返回值类型是block

    typedef void (^StatusSuccessBlock)(NSArray *array);

    typedef void (^StatusFailureBlock) (NSError *error);

     

    @interface StatusTool : NSObject

    // 此处的void,代表返回值类型是block

    + (void)statusesWithSuccess:(StatusSuccessBlock)success andFailure:(StatusFailureBlock)failure;

        //2.声明并赋值定义一个Block变量

        int (^addBlock)(int ,int )= ^(int x,int y){

            return x+ y;

        };

        

        //3.以Block作为函数参数,把参数像对象一样传递

        [self userBlockForOC:addBlock];

        

        //4. 将第2点和第3点合并一起,以内联定义的Block作为函数参数

        [self userBlockForOC:^(int x, int y){

            return x+y;

        }];

        [self userBlockForOC:^int(int x, int y) {

            return x+y;

        }];

        

    }

     

    //1.定义一个形参为Block的oc函数

    - (void)userBlockForOC: (int (^)(int x,int y))aBlock{

        NSLog(@"result = %d", aBlock(300,200));

    }

     

     

    总结如下:

    1.在Block内如果访问self的方法、变量、建议使用weakSef

    2.在Block中需要多次访问self,则需要使用StrongSelf

  • 相关阅读:
    失格
    救赎
    篝火晚会
    旅行家的预算
    荒诞
    mod
    clique
    序列
    [CF932E]Team Work & [BZOJ5093]图的价值
    NOIWC2018游记
  • 原文地址:https://www.cnblogs.com/dengchaojie/p/4743382.html
Copyright © 2011-2022 走看看