IOS学习 Block语法的使用:声明、创建、引用局部变量,使用block从后往前传值

来源:互联网 发布:网络按地域分类 编辑:程序博客网 时间:2024/06/05 10:49

使用block从后往前传值

①在后面控制器的 .h文件 中声明block

// 一会要传的值为NSString类型

typedef void (^newBlock)(NSString *);


@interface NewViewController : UIViewController

// 声明block属性

@property (nonatomiccopynewBlock block;

// 声明block方法

- (void)text:(newBlock)block;


@end

②在后面控制器的 .m文件 中设置block

// 设置block,设置要传的值

- (void)text:(newBlock)block

{

    self.block = block;

}


- (void)viewWillDisappear:(BOOL)animated

{

    [super viewWillDisappear:YES];

    if (self.block != nil) {

        self.block(@"呵呵");

    }

}

③在前面控制器的 .m文件 中接收传来的值

#import "ViewController.h"

#import "NewViewController.h"


@interface ViewController ()


@end


@implementation ViewController


- (void)viewDidLoad {

    [super viewDidLoad];

    UIButton *button = [UIButton buttonWithType:(UIButtonTypeRoundedRect)];

    button.frame = CGRectMake(0100100100);

    button.backgroundColor = [UIColor redColor];

    [button addTarget:self action:@selector(push) forControlEvents:(UIControlEventTouchUpInside)];

    [self.view addSubview:button];

}


- (void)push

{

    NewViewController *newVC = [[NewViewController allocinit];

    // 接收block传来的值

    newVC.block = ^(NSString *str){

        NSLog(@"%@", str);

    };

    [self.navigationController pushViewController:newVC animated:YES];

}


- (void)didReceiveMemoryWarning {

    [super didReceiveMemoryWarning];

    // Dispose of any resources that can be recreated.

}


@end

④最终实现效果:在控制台打印出了"呵呵"

    到此,block完成传值


  

 创建block匿名函数之前一般需要对self进行weak化,否则造成循环引用无法释放controller:

 _weak typeof(self) weakSelf = self      或者  __weak MyController *weakSelf = self

网址:http://blog.csdn.net/zz_mm/article/details/46818575


#import "HomeViewController.h"


typedef int(^Blokc)(int) ; //Block是类型


@interface HomeViewController ()


@end


@implementation HomeViewController


- (void)viewDidLoad {

    [superviewDidLoad];

    // Do any additional setup after loading the view.

    

    /*-------- 第一种 block的声明与创建 ----------*/

    //声明一个block变量

   /* int(^myBlock)(int);  //返回值(^Block变量)(参数)

    

    //创建block

    myBlock = ^(int a){

        NSLog(@"a = %d",a);

        return 20;

    };    //注意加分号

    

    //调用block

    int ret = myBlock(10);

    NSLog(@"ret = %d",ret);

    

    /*-------- 第二种 block的声明与创建 ----------*/

    //声明一个block变量

  /*  Blokc mmBlock;

    

    //创建block

    mmBlock = ^(int b){

        NSLog(@"b = %d",b);

        b += b;

        return b;

    };

    

    //调用block

    int back = mmBlock(5);

    NSLog(@"back = %d",back);

    

    [self test:mmBlock];*/

    

    /*-------- 第二种 block 引用局部变量 ----------*/

    

    //直接定义的局部变量,在Block中当常量使用,不可改变其值

//    int number = 20;

    

    //局部变量需使用_block修饰,才能够在block块中使用

    __block int number =20;  //注意block前两个下划线

    Blokc myblock2 = ^(int a) {

        number = 30;

        number++;

        NSLog(@"number = %d",number);

        return 10;

    };

    

    number = 40;

    myblock2(30);

    NSLog(@"number2 = %d",number);

}


//block作为参数声明,第一种

-(void)test:(int(^)(int))myBlock{

    // 逻辑判断。。。。

    

    //block回调

    int new = myBlock(20);

    NSLog(@"new = %d",new);

}


//block作为参数声明,第二种

-(void)testBlock:(Blokc)mmBlock{

    

}


0 0
原创粉丝点击