36.Block页面间传值

1.基本概念

  1. block是匿名函数, 能够实现函数回调功能, 用于页面之间通信和传值.
  2. 定义属性接收block必须使用copy修饰, retain和assign会造成野指针问题.
  3. block在某个方法中定义是存储在栈区, 在另一个雷中使用需要进行copy, 存储在堆区.
  4. 当不使用block时需要用自己的有的方法销毁, Block_Release()
  5. 在block实现部分, 不能直接使用实例变量, self调用属性, 因为block会造成self引用计数加1, 最终导致循引用问题. 使用__block解决循环引用的问题.

2.简单举例

MainViewController.m文件

#import "MainViewController.h"
#import "SecondViewController.h"
@interface MainViewController ()
@end
@implementation MainViewController

- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
    self.navigationController.navigationBar.translucent = NO;
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 300, 200, 49);
    button.layer.borderWidth = 1;
    button.layer.cornerRadius = 10;
    [button setTitle:@"下一页" forState:UIControlStateNormal];
    [self.view addSubview:button];
    [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)click:(UIButton *)button{
    SecondViewController *secondVC = [[SecondViewController alloc] init];
    //没有参数,没有返回值的block,通过block,改变self.view的背景颜色
    void (^myBlock)() = ^(){
     self.view.backgroundColor = [UIColor colorWithRed:arc4random()%256/255.0 green:arc4random()%256/255.0 blue:arc4random()%256/255.0 alpha:1];
    };
    //2.通过第二页的属性来接收block
    secondVC.myBlock = myBlock;

    //通过block实现从后向前传值,不需要返回值,因为调用更需要返回值,所以传值的时候只要参数
    void (^myblock)(NSString *) = ^(NSString *str){
        NSLog(@"%@",str);
    };
    secondVC.myblock = myblock;

    void (^block)(NSArray *) = ^(NSArray *arr){
        //传过来的arr的有效范围就这对大括号里,所以穿过来的数据处理都在block里面
        NSLog(@"%@",arr);
    };
    secondVC.block = block;
    [self.navigationController pushViewController:secondVC animated:YES];
    [secondVC release];
}

SecondViewController.h和SecondViewController.m文件

#import <UIKit/UIKit.h>
typedef void(^Block)(NSArray *);
@interface SecondViewController : UIViewController

//1.写一条属性,负责接受第一页向第二页传递过来的block
@property(nonatomic,copy)void(^myBlock)();
@property(nonatomic,copy)void(^myblock)(NSString *);
@property(nonatomic,copy)Block block;
//block作为属性时为了防止block进入到栈区,栈区内存不需要我们进行管理,很可能出现block消失的情况,所以需要拷贝一份到堆区
@end
#import "SecondViewController.h"
@interface SecondViewController ()
@end
@implementation SecondViewController
- (void)dealloc
{
    //这是block自己的release的方法
    Block_release(_myBlock);
    Block_release(_myblock);
    Block_release(_block);
    [super dealloc];
}
- (void)viewDidLoad {
    [super viewDidLoad];
    self.view.backgroundColor = [UIColor cyanColor];
    self.navigationController.navigationBar.translucent = NO;
    UIButton *button = [UIButton buttonWithType:UIButtonTypeCustom];
    button.frame = CGRectMake(100, 300, 200, 49);
    button.layer.borderWidth = 1;
    button.layer.cornerRadius = 10;
    [button setTitle:@"返回" forState:UIControlStateNormal];
    [self.view addSubview:button];
    [button addTarget:self action:@selector(click:) forControlEvents:UIControlEventTouchUpInside];
}
- (void)click:(UIButton *)button{
    //3.调用传过来的block
    self.myBlock();
    self.myblock(@"网易新闻");
    NSArray *arr = @[@"zhangsan",@"lishi"];
    self.block(arr);
    [self.navigationController popToRootViewControllerAnimated:YES];
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值