1.定义和使用Block

 #import "ViewController.h"

 @interface ViewController ()

 @end

 @implementation ViewController

 - (void)viewDidLoad {
[super viewDidLoad]; //定义block 无返回值,无参数
void (^nameBlock)() = ^ () {
NSLog(@"姓名: Block");
}; //定义block 有返回值,有参数
int (^ageBlock)(int) = ^(int age) {
NSLog(@"年龄: %d",age);
return age + ;
}; //调用block
nameBlock();
int age = ageBlock();
NSLog(@"》》》年龄:%d",age);
nameAndAgeBlock(@"SD.Team",);
} void (^nameAndAgeBlock)() = ^(NSString *name,int age) {
NSLog(@"姓名:%@,年龄:%d",name,age);
}; - (void)didReceiveMemoryWarning {
[super didReceiveMemoryWarning];
} @end Block 定义与使用

  运行结果:
  
  通过运行上面的简单代码示例,可以得知:
    [1].在类中,定义一个Block变量,就像定义一个函数。
    [2].Block可以定义在方法内部,也可以定义在方法外部。
    [3].只有调用Block时候,才会执行其{}体内的代码。

2.__block关键字

  在Block的{}体内,是不可以对外面的变量进行更改的,将会报错(Variable is not assigning (missing __block type)),比如下面:

 - (void)viewDidLoad {
[super viewDidLoad];
int myAge = ;
void (^updateAge)(int) = ^(int age){
myAge = myAge + age;
NSLog(@"age:%d",myAge);
};
}

  要如何更正才能对外面的值呢?通过添加__block 关键字即可

 - (void)viewDidLoad {
[super viewDidLoad];
__block int myAge = ;
void (^updateAge)(int) = ^(int age){
myAge = myAge + age;
NSLog(@"age:%d",myAge);
}; updateAge();
}


3.Block作为property属性

  如有一需求:在ViewController中,点击设置按钮,push到下一个页面SettingViewController,在SettingViewController的age输入框TextField中更新年龄,返回的时候,在ViewController的年龄Label上面显示已更新的年龄。可以通过delegate 来实现,delegate前面讲过了,这次我们就用block来实现.
  SettingViewController:

 //SettingViewController.h 文件
@interface SettingViewController : UIViewController
@property (nonatomic, copy) void (^updateAgeBlock)(NSString *age); @end //SettingViewController.m 文件
- (IBAction)updateAgeBtnClicked:(id)sender {
if (self.updateAgeBlock) {
self.updateAgeBlock(self.ageTextField.text);
}
[self.navigationController popViewControllerAnimated:YES];
}

  ViewController:

 - (IBAction)settingClicked:(id)sender
{
SettingViewController *settingVC = [[SettingViewController alloc] initWithNibName:@"SettingViewController" bundle:nil];
settingVC.updateAgeBlock = ^(NSString *age){
[self updateAgeLabel:age];
};
[self.navigationController pushViewController:settingVC animated:YES];
} - (void)updateAgeLabel:(NSString *)age
{
self.ageLabel.text = age;
}

我们通过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. DP 60题 -2 HDU1025 Constructing Roads In JGShining's Kingdom

    Problem Description JGShining's kingdom consists of 2n(n is no more than 500,000) small cities which ...

  2. 【Elasticsearch学习】之基础概念

    Elasticsearch是一个近实时的分布式搜索引起,其底层基于开源全文搜索库Lucene:Elasticsearch对Lucene进行分装,对外提供REST API 的操作接口.基于 ES,可以快 ...

  3. 详解十大经典数据挖掘算法之——Apriori

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第19篇文章,我们来看经典的Apriori算法. Apriori算法号称是十大数据挖掘算法之一,在大数据时代威风无两,哪 ...

  4. A. Guest From the Past(数学推式子)

    \(n元,买塑料杯子a元,买玻璃杯子b元,但玻璃杯子用完后可以卖c元\) \(求最多买的杯子.\) \(---------------------------分割------------------- ...

  5. C. Four Segments 前缀后缀

    C. Four Segments 这种分成了三个节点一般都可以处理一下前缀处理一下后缀,或者处理一下前面的这个点,处理一下后面的这个点,然后再枚举中间这个点. 如果和中间这个点有关的,那么就可以换一下 ...

  6. Linux编程实现递归查找文件

    命令格式如下:SCRIPT_NAME       SEARCH_ON_DIR       SEARCH_FILENAME #!/bin/bash Find(){ files=`` for file i ...

  7. C# 基础至集合-数组、List<T>、ArrayList、LinkedList、HashMap的一些区别

    1:数组 ]; //赋值 strs[] = "; strs[] = "; //修改 strs[] = "burg"; //删除 没法删除 除非转化为可变数组li ...

  8. C:简单实现BaseCode64编码

    What is Base64? 前言 目前来看遇到过Base 16.Base 32.Base 64的编解码,这种编码格式是二进制和文本编码转化,是对称并且可逆的转化.Base 64总共有64个ASCI ...

  9. [hdu5348]图上找环,删环

    http://acm.hdu.edu.cn/showproblem.php?pid=5348 题意:给一个无向图,现在要将其变成有向图,使得每一个顶点的|出度-入度|<=1 思路:分为两步,(1 ...

  10. Typora + Powershell/bash + Git搭建自己的笔记

    网上都说什么onenote,evernote,ant等笔记.个人感觉这些都不算太好,还是自己用简易东西搭建一个笔记. 个人推荐使用typora写笔记. 上面既有文件目录,还能通过模糊搜索. 然后需要p ...