zoukankan      html  css  js  c++  java
  • block的常见用法

    一、声明和定义

    1、声明

    声明方式:返回值(^block)(参数)。声明时,参数变量名可以省略;使用时,参数变量名不能省略,不然会无法调用传入的参数

    void(^block)();    
    void(^block)(int);
    int(^block)(int);
    

     2、定义

    • 无参无返回值。可以省略写
    void(^block)() = ^{};
    void(^block)() = ^(){};
    • 有参无返回值。
    void(^block)(int) = ^(int a){};
    • 有参有返回值。返回值可以省略,也可以不省略
    int(^block)(int) = ^int(int a){};
    int(^block)(int) = ^(int a){};
    

    二、简单使用场景

    保存一段代码,在不同方法中调用

    @interface ViewController ()
    @property (nonatomic, strong) void(^block)();
    @end
    
    - (void)viewDidLoad {
        [super viewDidLoad];
        void(^block)() = ^{   
           NSLog(@"调用Block");      
        }; 
        _block = block; 
    }
    
    - (void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
         _block();
    }

     使用技巧:

         inlineBlock:快速生成block代码

        <#returnType#>(^<#blockName#>)(<#parameterTypes#>) = ^(<#parameters#>) {
            <#statements#>
        };
    

    三、逆向传值

    在数据来源的第二个文件中,定义一个block变量,放入需要传递的值

    #import <UIKit/UIKit.h>
    @class modalViewController;
    
    @interface modalViewController : UIViewController
    @property(nonatomic,strong)void (^valueBolck)(NSString *value);
    @end
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        if (_valueBolck) {
            _valueBolck(@"123");
        }   
        [self dismissViewControllerAnimated:YES completion:nil];
    }
    

    在modal回来的需接受数据的文件中,导入数据源文件,并接收值

    #import "ViewController.h"
    #import "modalViewController.h"
    
    -(void)touchesBegan:(NSSet<UITouch *> *)touches withEvent:(UIEvent *)event{
        modalViewController *mVC = [[modalViewController alloc]init];
    mVC.valueBolck = ^(NSString *value){ NSLog(@"%@",value); };
    [self presentViewController:mVC animated:YES completion:nil]; }

     四、MRC和ARC下block存放区域的区别

    1、MRC下的block

    • 情形一:如果block没有访问外部的局部变量,或者访问的外部局部变量被static修饰过,那么block默认存在于全局区(Global)。可以retain,可以copy。copy后依然存在全局区中。
    • 情形二:如果block访问外部的局部变量,那么block存放在栈(Stack)中。此时,如果block声明为成员变量,不能使用retain,因为此时依然放在栈里面,会自动销毁。需要用copy声明。此种情况下copy后的block,放在堆(Malloc)里面。
    •  MRC小常识:
    1. block是不是对象?是的。在文档working with blocks中可以看到。 

    2. MRC开发习惯:访问属性或者设置属性,必须使用点语法,不要使用下划线.

    3. MRC没有强指针,默认一个对象就是基本类型

    2、ARC下的block

    • 情形一:如果block没有访问外部的局部变量,或者访问的外部局部变量被static修饰过,那么block默认存在于全局区(Global)。可以weak,可以strong。此后的block依然存在于全局区中。
    • 情形二:如果block访问外部的局部变量,那么block存放在堆(Malloc)中。此时,如果block声明为成员变量,不能使用weak,因为此时没有强指针指向,会自动销毁。strong后重新调用的block存在于堆(Malloc)中。
    • 所以,不要用weak修饰ARC下的block

    五、block的值传递

    1、默认block访问外部局部变量没有被任何关键字修饰,都是值传递 

    2、bolck访问外部变量被__block、static,指针传递

    3、访问的全局变量,也是指针传递

    (关于__bolcok,待补充)

    六、bolcok开发使用场景

    block开发使用场景(参数适用):

    什么时候使用blcok充当参数?

    思想:封装一个功能,这个功能做什么事情由外界决定,但是什么时候调用由内部决定,这时候就需要把block充当一个参数去使用。

    链式编程思想:把方法调用通过点语法链接,可读性非常好。

    blcok方式实现举例:

    -(CaculatorViewController *(^)(int))add{
        return ^(int value){
            _result += value;
            return self;
        };
    }

    (缓慢更新中...)

     

  • 相关阅读:
    转战物联网·基础篇06-深入理解MQTT协议之基本术语
    转战物联网·基础篇05-通俗理解MQTT协议的实现原理和异步方式
    转战物联网&#183;基础篇04-不可不知的进制关系与数据传输的本质
    转战物联网·基础篇03-从JSON数据到短指令谈思维的转变
    转战物联网·基础篇02-物联网中的角儿
    转战物联网·基础篇01-物联网之我见
    nRF24L01+组网方式及防撞(防冲突)机制的实战分享
    ElementUi中el-table分页效果
    原生无缝Banner轮播图
    详解立即执行函数(function(){}()),(function(){})()
  • 原文地址:https://www.cnblogs.com/xiao-xiao-/p/5136161.html
Copyright © 2011-2022 走看看