block的常见用法

1、声明和定义

一、声明编程

声明方式:返回值(^block)(参数)。声明时,参数变量名能够省略;使用时,参数变量名不能省略,否则会没法调用传入的参数atom

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

 

 二、定义spa

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

 

2、简单使用场景

保存一段代码,在不一样方法中调用指针

@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();
}

 

 使用技巧:code

     inlineBlock:快速生成block代码对象

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

 

3、逆向传值

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

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

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

一、MRC下的block文档

  • 情形一:若是block没有访问外部的局部变量,或者访问的外部局部变量被static修饰过,那么block默认存在于全局区(Global)。能够retain,能够copy。copy后依然存在全局区中。
  • 情形二:若是block访问外部的局部变量,那么block存放在栈(Stack)中。此时,若是block声明为成员变量,不能使用retain,由于此时依然放在栈里面,会自动销毁。须要用copy声明。此种状况下copy后的block,放在堆(Malloc)里面。

 

  •  MRC小常识:
  1. block是否是对象?是的。在文档working with blocks中能够看到。 it

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

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

二、ARC下的block

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

5、block的值传递

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

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

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

(关于__bolcok,待补充)

6、bolcok开发使用场景

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

何时使用blcok充当参数?

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

 

链式编程思想:把方法调用经过点语法连接,可读性很是好。

blcok方式实现举例:

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

 

(缓慢更新中...)

相关文章
相关标签/搜索