36.Block页面间传值
2015-08-12 18:44
357 查看
1.基本概念
block是匿名函数, 能够实现函数回调功能, 用于页面之间通信和传值.定义属性接收block必须使用copy修饰, retain和assign会造成野指针问题.
block在某个方法中定义是存储在栈区, 在另一个雷中使用需要进行copy, 存储在堆区.
当不使用block时需要用自己的有的方法销毁, Block_Release()
在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]; }
相关文章推荐
- spring中context:property-placeholder/元素
- Ice_cream’s world III
- 知乎-Android自动化测试工具总结
- uva 120 Stacks of Flapjacks
- 【三分】Expanding Rods
- 【移动安全】Android App Smail代码动态跟踪调试方法
- Http 异步批量下载图片之优化
- java doc排除不需要的public method
- HD 1875 畅通工程再续 【Kruskal】
- Error generating final archive: Debug Certificate expired on 10/09/18 16:30[/code]
- UITabBar,快捷菜单,block实现传值
- 搜索练习题【题解】
- 用Properties加载“ .properties "文件产生的java.lang.NullPointerException的解决之道
- html5 video标签不能播放mp4的问题
- AndroidStudio project添加.so文件方法
- iOS编程——通过UUID和KeyChain来代替Mac地址实现iOS设备的唯一标示(Swift 优化版)
- Shell编程之正则表达式
- IOS文件系统
- Java 动态性
- 初识JAVA