[Objective-C] 020_ Block
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的更多相关文章
- @weakify, @strongify ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- ObjC的Block中使用weakSelf/strongSelf @weakify/@strongify
首先要说说什么时候使用weakSelf和strongSelf. 下面引用一篇博客<到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf>的内容: Objec ...
- iOS Block中的weakSelf/strongSelf
Objective C 的 Block 是一个很实用的语法,特别是与GCD结合使用,可以很方便地实现并发.异步任务.但是,如果使用不当,Block 也会引起一些循环引用问题(retain cycle) ...
- 到底什么时候才需要在ObjC的Block中使用weakSelf/strongSelf
转载,原文: http://blog.lessfun.com/blog/2014/11/22/when-should-use-weakself-and-strongself-in-objc-block ...
- 唐巧的iOS技术博客选摘
1. 那些被遗漏的objective-c保留字:http://blog.devtang.com/blog/2013/04/29/the-missing-objc-keywords/ 2. 使用cr ...
- Automake
Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...
- Objective C block背后的黑魔法
前言 block在Objective C开发中应用非常广泛,我们知道block会捕获外部对象,也知道使用block要防止循环引用. "知其然而不知其所以然"是一件非常痛苦的事情,那 ...
- Objective-C( block的使用)
block block用来保存一段代码 block的标志:^ block跟函数很像:可以保存代码.有返回值.有形参.调用方式跟调用方法一样 block内部可以访问外面的变量 默认情况下,block内部 ...
- 初学Objective - C语法之代码块(block)
一.block声明 1.无参数,无返回值: void (^sayHi)(); 2.有参数,有返回值: NSInteger (^operateOfValue)(NSInteger num); block ...
随机推荐
- App 抓包代理设置
1.设置 Fiddler 打开 Fiddler,Tools --> Fiddler Options --> HTPS (配置完后记得要重启 Fiddler) 选中 "D ...
- 数据库SQL---实体-联系模型(E-R模型)
1.E-R模型的基本概念与表示 1)实体与实体集 (1)实体:可以是有形的.实在的事物(如每个员工),可以是抽象的.概念上存在的事物(如一个部门). (2)实体的特征:独立存在.可区别于其他实体. ( ...
- GitHub 热点速览 Vol.18:刷 LeetCode 的正确姿势
作者:HelloGitHub-小鱼干 摘要:找对路子,事半功倍,正如本周 GitHub Trending #刷 LeetCode# 主题想表达的那般,正确的学习姿势方能让人走得更远,走进大厂
- Shell简单实现多线程
一.目的 解决Shell脚本单线程下效率低下的问题 二.适用场景 需要在Linux系统执行同一项命令,但是针对不同的对象,例如PING检测主机,当然可以延展,只要是命令之间不会产生冲突就可以了 ...
- 树形dp compare E - Cell Phone Network POJ - 3659 B - Strategic game POJ - 1463
B - Strategic game POJ - 1463 题目大意:给你一棵树,让你放最少的东西来覆盖所有的边 这个题目之前写过,就是一个简单的树形dp的板题,因为这个每一个节点都需要挺好处 ...
- 王颖奇 201771010129《面向对象程序设计(java)》第七周学习总结
实验七 继承附加实验 实验时间 2018-10-11 1.实验目的与要求 (1)进一步理解4个成员访问权限修饰符的用途: A.仅对本类可见-private B.对所有类可见-public C.对本包和 ...
- MySQL 入门(3):事务隔离
摘要 在这一篇内容中,我将从事务是什么开始,聊一聊事务的必要性. 然后,介绍一下在InnoDB中,四种不同级别的事务隔离,能解决什么问题,以及会带来什么问题. 最后,我会介绍一下InnoDB解决高并发 ...
- 浅析Spring中bean的作用域
一.前言 刚刚花了点时间,阅读了一下Spring官方文档中,关于bean的作用域这一块的内容.Spring-4.3.21官方文档中,共介绍了七种bean作用域,这篇博客就来简单介绍一下这七种作用域 ...
- Linux内核驱动学习(二)添加自定义菜单到内核源码menuconfig
文章目录 目标 drivers/Kconfig demo下的Kconfig 和 Makefile Kconfig Makefile demo_gpio.c 目标 Kernel:Linux 4.4 我编 ...
- C#枚举高级战术
文章开头先给大家出一道面试题: 在设计某小型项目的数据库(假设用的是 MySQL)时,如果给用户表(User)添加一个字段(Roles)用来存储用户的角色,你会给这个字段设置什么类型?提示:要考虑到角 ...