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 + ;
  21. };
  22.  
  23. //调用block
  24. nameBlock();
  25. int age = ageBlock();
  26. NSLog(@"》》》年龄:%d",age);
  27. nameAndAgeBlock(@"SD.Team",);
  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 = ;
  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 = ;
  4. void (^updateAge)(int) = ^(int age){
  5. myAge = myAge + age;
  6. NSLog(@"age:%d",myAge);
  7. };
  8.  
  9. updateAge();
  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的效果。

[Objective-C] 020_ Block的更多相关文章

  1. @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

  2. ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify

    首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...

  3. iOS Block中的weakSelf/strongSelf

    Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发.异步任务.但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle) ...

  4. 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf

    转载,原文: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block ...

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

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

  6. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  7. Objective C block背后的黑魔法

    前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件非常痛苦的事情,那 ...

  8. Objective-C( block的使用)

    block block用来保存一段代码 block的标志:^ block跟函数很像:可以保存代码.有返回值.有形参.调用方式跟调用方法一样 block内部可以访问外面的变量 默认情况下,block内部 ...

  9. 初学Objective - C语法之代码块(block)

    一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...

随机推荐

  1. JAVA大数几算--HDU 2054 A == B ?

    Problem Description Give you two numbers A and B, if A is equal to B, you should print "YES&quo ...

  2. python selenium(用例断言)

    1.if ...else ...判断进行断言 from time import * from selenium import webdriver "): driver = webdriver ...

  3. Flutter 打包Android APK 笔记与事项

    获取一个KEY 首先要获取 你的 打包应用的一个 key ,这一步其实和 在AndroidStudio 上打包 APK 一样,都是要注册一个本地的 key,key 其实也就是 jks文件啦. 如果已经 ...

  4. 题目分享H 二代目

    题意:有m个限制,每个限制l1,r1,l2,r2四个数,限制了一个长度为n的数第l1到r1位要与第l2到r2相同,保证r1-l1=r2-l2,求在限制下一共有多少种数 分析: 暴力的话肯定是从l1-r ...

  5. Scrapy爬虫快速入门

    安装Scrapy Scrapy是一个高级的Python爬虫框架,它不仅包含了爬虫的特性,还可以方便的将爬虫数据保存到csv.json等文件中. 首先我们安装Scrapy. pip install sc ...

  6. JavaWeb----Servler

    Servlet简介 Servlet就是sun公司开发动态web的一门技术 Sun在这些API中提供一个接口叫做:Servlet,如果你想开发一个Servlet程序,只需要完成两个小步骤: 编写一个类, ...

  7. 初识CoAP协议

    前言 本文介绍什么是CoAP,以及如何在物联网设备上使用它.CoAP是一种物联网协议,具有一些专门为受约束的设备而设计的有趣功能.还有其他一些可用于构建物联网解决方案的IoT协议,例如MQTT等. 物 ...

  8. 挑战程序竞赛 反转开关 poj3276

    这个我其实也没有看太懂它的证明过程. 1.若某一个位置被翻转了n次,则其实际上被翻转了n%2次. 2.分析易知翻转的顺序并不影响最终结果. 3.现在我们着眼于第1个位置,可知若要将第1个位置进行翻转只 ...

  9. Quartus II 中参数化模块库(LPM)的使用

    Quartus II  的LPM库所在的目录是\altera\11.0\quartus\libraries\megafunctions 现以LPM_MULT为例进行演示: 思路:1.首先创建一个pro ...

  10. [hdu4301]DP

    题意:给一个2*n的矩形块,求把它分成k个连通块的方法数.(有公共边即视为联通) 思路:由于宽度只有2,于是很容易设计状态使问题满足阶段性以及无后效性.具体来说,令dp[i][j][0]和dp[i][ ...