[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 ...
随机推荐
- 网络流--最大流--POJ 2139(超级源汇+拆点建图+二分+Floyd)
Description FJ's cows really hate getting wet so much that the mere thought of getting caught in the ...
- 2019 ICPC 南京网络赛 H-Holy Grail
As the current heir of a wizarding family with a long history,unfortunately, you find yourself force ...
- vue 比 js的强大
//js写留言板 <!DOCTYPE html><html lang="en"><head> <meta charset="UT ...
- spring对websocket的集成和使用
WebSocket是HTML5提出的一个用于通信的协议规范,该协议通过一个握手机制,在客户端和服务端之间建立一个类似于TCP的连接,从而方便客户端和服务端之间的通信. WebSocket协议本质上是一 ...
- Day_09【常用API】扩展案例4_将字符串变为字符数组,并将大写字母改为小写,首尾内容不同互换,并将索引为偶数的元素替换
分析以下需求,并用代码实现 1.键盘录入一个字符串 2.将该字符串变成字符数组(不能使用toCharArray()方法) 3.将字符数组中的所有大写字母变成小写字母(不能使用toLowerCase() ...
- repo使用总结—从入门到入门
文章目录 1 what's repo 2 官方文档 Repo 命令参考资料 help 帮助 init 初始化 sync 同步所有项目文件 upload 提交更改 diff download foral ...
- C# 9.0 新特性预览 - 空参数校验
C# 9.0 新特性预览 - 空参数校验 前言 随着 .NET 5 发布日期的日益临近,其对应的 C# 新版本已确定为 C# 9.0,其中新增加的特性(或语法糖)也已基本锁定,本系列文章将向大家展示它 ...
- SpringBoot + SpringCloud的爬坑之旅
1,application.yaml中配置没有生效问题解决 如果配置文件确认没有错误但是没有生效首先是要到编译目录去查看是否被编译过去了,如果没有,请先将项目clean在重启 但是idea启动项目时也 ...
- 在ef core中使用postgres数据库的全文检索功能实战
起源 之前做的很多项目都使用solr/elasticsearch作为全文检索引擎,它们功能全面而强大,但是对于较小的项目而言,构建和维护成本显然过高,尤其是从关系数据库/文档数据库到全文检索引擎的数据 ...
- navicat 远程链接Mysql问题
mysql服务器需要配置 给远程访问配置权限:注意自己的用户名和密码 使用select host, user, password from mysql.user;查看是否配置好相应的用户和密码 nav ...