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相关推荐

  1. 唐巧的iOS技术博客选摘

    1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用cras ...

  2. HCIE-Cloud笔试

    前言: 目录按照HCIE-Cloud官方培训教材V2.0进行制定,通过笔试考点挂钩HCIE-Cloud官方培训教材V2.0中的知识,相互强化记忆 1.优点:基本笔试的知识分类,是按照该教材的目录大纲分 ...

  3. 《黑马程序员》 block的使用(Objective - c语法)

    ------- <a href="http://www.itheima.com" target="blank">android培训</a> ...

  4. 如何在Objective C中声明Block?

    本文翻译自http://fuckingblocksyntax.com/ 作为局部变量: returnType(^blockName)(parameterTypes) = ^returnType(par ...

  5. iOS完全自学手册——[三]Objective-C语言速成,利用Objective-C创建自己的对象...

    1.前言 上一篇已经介绍了App Delegate.View Controller的基本概念,除此之外,分别利用storyboard和纯代码创建了第一个Xcode的工程,并对不同方式搭建项目进行了比较 ...

  6. Objective C ARC 使用及原理

    Objective C ARC 使用及原理 手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档 ...

  7. iOS探索:Block解析浅谈

    什么是Block Block是将函数及其执行上下文封装起来的对象 接下来让我们通过源码来看一看Block的本质 我们在一个方法中写了三行代码,第一行是定义了一个局部变量,第二行是一个Block,第三行 ...

  8. block在美团iOS的实践

    说到block,相信大部分iOS开发者都会想到retain cycle或是__block修饰的变量. 但是本文将忽略这些老生常谈的讨论,而是将重点放在美团iOS在实践中对block的应用,希望能对同行 ...

  9. 睡眠排序法-objective C版的代码

    将开发过程比较重要的代码做个珍藏,下面代码内容是关于睡眠排序法-objective C版的代码,应该能对各位朋友有帮助. @interface NSArray (SleepSort) - (void) ...

最新文章

  1. 招聘 | 旷视研究院博士后招聘
  2. 对称加密DES和TripleDES
  3. springaop事务逻辑原理_太狠了!阿里大牛手写的Spring核心面试笔记:IOC+AOP+MVC+事务...
  4. 将Windows下的InfluxDB、Grafana做成Windows服务
  5. 【Python】创建和使用类
  6. JVM(一) ---JVM的数据模型
  7. bubble html5,利用HTML5 Canvas创建交互式Bubble Chart
  8. [C++]variadic function template expansion 变元函数参数的展开规则
  9. Docker简单实践(一)
  10. 存储过程/函数权限的问题解决(The user specified as a definer ('root'@'%') does not exist)...
  11. ospf学习笔记-7种状态
  12. zTree——删除所有节点
  13. 哨兵系列卫星_传感器|英国Teledyne e2v公司为“哥白尼哨兵”卫星任务提供CO2监测传感器...
  14. php清除页面别人挂的马
  15. Blender 常用快捷键记录 (二)
  16. 微信android4.1登陆失败,微信授权登录 IOS成功 安卓失败
  17. Unity 第三人称人物移动
  18. HEVC与AVC的区别与联系(十二)
  19. 服务器频繁重启怎么解决
  20. 使用快捷指令和carplay发送停车位置(高德地图)

热门文章

  1. 【面试】Java集合篇--图解HashMap的put方法的具体流程
  2. python Django数据库保存操作
  3. python3将列表当做堆栈使用
  4. ajax jq 图片上传请求头_全面分析前端的网络请求方式:Ajax ,jQuery ,axios,fetch
  5. Centos 7下查看当前目录大小及文件个数
  6. android 拦截点击事件,Android事件拦截机制
  7. eclipse让实现类也添加上接口的注释_多线程:面试常问的两种创建方式,数据共享实现和正确停止线程...
  8. 对YUV4:2:0认识理解
  9. python数据包的作用_使用Python将登录数据包发送到Minecraft服务器不起作用
  10. python能够接收由键盘输入的函数是_python实现键盘输入的实操方法