[Objective-C] 020_ Block
1.定义和使用Block
1 #import "ViewController.h" 2 3 @interface ViewController () 4 5 @end 6 7 @implementation ViewController 8 9 - (void)viewDidLoad { 10 [super viewDidLoad]; 11 12 //定义block 无返回值,无参数 13 void (^nameBlock)() = ^ () { 14 NSLog(@"姓名: Block"); 15 }; 16 17 //定义block 有返回值,有参数 18 int (^ageBlock)(int) = ^(int age) { 19 NSLog(@"年龄: %d",age); 20 return age + 1; 21 }; 22 23 //调用block 24 nameBlock(); 25 int age = ageBlock(3); 26 NSLog(@"》》》年龄:%d",age); 27 nameAndAgeBlock(@"SD.Team",2015); 28 } 29 30 void (^nameAndAgeBlock)() = ^(NSString *name,int age) { 31 NSLog(@"姓名:%@,年龄:%d",name,age); 32 }; 33 34 - (void)didReceiveMemoryWarning { 35 [super didReceiveMemoryWarning]; 36 } 37 38 @end 39 40 Block 定义与使用
运行结果:
通过运行上面的简单代码示例,可以得知:
[1].在类中,定义一个Block变量,就像定义一个函数。
[2].Block可以定义在方法内部,也可以定义在方法外部。
[3].只有调用Block时候,才会执行其{}体内的代码。
2.__block关键字
在Block的{}体内,是不可以对外面的变量进行更改的,将会报错(Variable is not assigning (missing __block type)),比如下面:
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 int myAge = 25; 4 void (^updateAge)(int) = ^(int age){ 5 myAge = myAge + age; 6 NSLog(@"age:%d",myAge); 7 }; 8 }
要如何更正才能对外面的值呢?通过添加__block 关键字即可
1 - (void)viewDidLoad { 2 [super viewDidLoad]; 3 __block int myAge = 25; 4 void (^updateAge)(int) = ^(int age){ 5 myAge = myAge + age; 6 NSLog(@"age:%d",myAge); 7 }; 8 9 updateAge(3); 10 }
3.Block作为property属性
如有一需求:在ViewController中,点击设置按钮,push到下一个页面SettingViewController,在SettingViewController的age输入框TextField中更新年龄,返回的时候,在ViewController的年龄Label上面显示已更新的年龄。可以通过delegate 来实现,delegate前面讲过了,这次我们就用block来实现.
SettingViewController:
1 //SettingViewController.h 文件 2 @interface SettingViewController : UIViewController 3 @property (nonatomic, copy) void (^updateAgeBlock)(NSString *age); 4 5 @end 6 7 //SettingViewController.m 文件 8 - (IBAction)updateAgeBtnClicked:(id)sender { 9 if (self.updateAgeBlock) { 10 self.updateAgeBlock(self.ageTextField.text); 11 } 12 [self.navigationController popViewControllerAnimated:YES]; 13 }
ViewController:
1 - (IBAction)settingClicked:(id)sender 2 { 3 SettingViewController *settingVC = [[SettingViewController alloc] initWithNibName:@"SettingViewController" bundle:nil]; 4 settingVC.updateAgeBlock = ^(NSString *age){ 5 [self updateAgeLabel:age]; 6 }; 7 [self.navigationController pushViewController:settingVC animated:YES]; 8 } 9 10 - (void)updateAgeLabel:(NSString *)age 11 { 12 self.ageLabel.text = age; 13 }
我们通过block方式同样达到了delegate的效果。
转载于:https://www.cnblogs.com/superdo/p/5081115.html
[Objective-C] 020_ Block相关推荐
- 唐巧的iOS技术博客选摘
1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用cras ...
- HCIE-Cloud笔试
前言: 目录按照HCIE-Cloud官方培训教材V2.0进行制定,通过笔试考点挂钩HCIE-Cloud官方培训教材V2.0中的知识,相互强化记忆 1.优点:基本笔试的知识分类,是按照该教材的目录大纲分 ...
- 《黑马程序员》 block的使用(Objective - c语法)
------- <a href="http://www.itheima.com" target="blank">android培训</a> ...
- 如何在Objective C中声明Block?
本文翻译自http://fuckingblocksyntax.com/ 作为局部变量: returnType(^blockName)(parameterTypes) = ^returnType(par ...
- iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象...
1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...
- Objective C ARC 使用及原理
Objective C ARC 使用及原理 手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档 ...
- iOS探索:Block解析浅谈
什么是Block Block是将函数及其执行上下文封装起来的对象 接下来让我们通过源码来看一看Block的本质 我们在一个方法中写了三行代码,第一行是定义了一个局部变量,第二行是一个Block,第三行 ...
- block在美团iOS的实践
说到block,相信大部分iOS开发者都会想到retain cycle或是__block修饰的变量. 但是本文将忽略这些老生常谈的讨论,而是将重点放在美团iOS在实践中对block的应用,希望能对同行 ...
- 睡眠排序法-objective C版的代码
将开发过程比较重要的代码做个珍藏,下面代码内容是关于睡眠排序法-objective C版的代码,应该能对各位朋友有帮助. @interface NSArray (SleepSort) - (void) ...
最新文章
- 招聘 | 旷视研究院博士后招聘
- 对称加密DES和TripleDES
- springaop事务逻辑原理_太狠了!阿里大牛手写的Spring核心面试笔记:IOC+AOP+MVC+事务...
- 将Windows下的InfluxDB、Grafana做成Windows服务
- 【Python】创建和使用类
- JVM(一) ---JVM的数据模型
- bubble html5,利用HTML5 Canvas创建交互式Bubble Chart
- [C++]variadic function template expansion 变元函数参数的展开规则
- Docker简单实践(一)
- 存储过程/函数权限的问题解决(The user specified as a definer ('root'@'%') does not exist)...
- ospf学习笔记-7种状态
- zTree——删除所有节点
- 哨兵系列卫星_传感器|英国Teledyne e2v公司为“哥白尼哨兵”卫星任务提供CO2监测传感器...
- php清除页面别人挂的马
- Blender 常用快捷键记录 (二)
- 微信android4.1登陆失败,微信授权登录 IOS成功 安卓失败
- Unity 第三人称人物移动
- HEVC与AVC的区别与联系(十二)
- 服务器频繁重启怎么解决
- 使用快捷指令和carplay发送停车位置(高德地图)
热门文章
- 【面试】Java集合篇--图解HashMap的put方法的具体流程
- python Django数据库保存操作
- python3将列表当做堆栈使用
- ajax jq 图片上传请求头_全面分析前端的网络请求方式:Ajax ,jQuery ,axios,fetch
- Centos 7下查看当前目录大小及文件个数
- android 拦截点击事件,Android事件拦截机制
- eclipse让实现类也添加上接口的注释_多线程:面试常问的两种创建方式,数据共享实现和正确停止线程...
- 对YUV4:2:0认识理解
- python数据包的作用_使用Python将登录数据包发送到Minecraft服务器不起作用
- python能够接收由键盘输入的函数是_python实现键盘输入的实操方法