[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 ...
随机推荐
- swipe 滑动操作
1.swipe() 滑动用法 swipe(self, start_x, start_y, end_x, end_y, duration=None) :Args: - start_x - 开始滑动的x坐 ...
- (一只小白)对private,final关键字的一些认知
1.private: private是私有的意思,在Java中可以用来修饰类里面的成员变量或者成员方法(注:不能修饰一个类,因为一个类如果外部无法访问的话,面向对象的编程思想将毫无意义),顾名思义,被 ...
- 【HBase】HBase和Sqoop整合
目录 需求一 步骤 一.修改sqoop配置文件 二.在mysql中创建数据库和数据表并插入数据 三.将mysql表中的数据导入到HBase表中 四.在HBase表中查看数据 需求二 步骤 一.创建hi ...
- Day_09【常用API】扩展案例8_计算字符'j'和字符串'java'在字符串中出现的次数
需求说明 定义如下字符串: String str = "javajfiewjavajfiowfjavagkljjava"; 请分别定义方法统计出: 1.字符串中:字符j的数量 2. ...
- CF-292D Connected Components 并查集 好题
D. Connected Components 题意 现在有n个点,m条编号为1-m的无向边,给出k个询问,每个询问给出区间[l,r],让输出删除标号为l-r的边后还有几个连通块? 思路 去除编号为[ ...
- flink基础篇
Flink面试--核心概念和基础考察 1.简单介绍一下 Flink 2.Flink 相比传统的 Spark Streaming 有什么区别? 3.Flink 的组件栈有哪些? 面试知识 ...
- Django :Content-Type组件
Content_Type 组件 用法: model.py: from django.db import models # Create your models here. class Food(mod ...
- libevent到底是同步还是异步,是阻塞还是非阻塞
应该从不同角度看libevent的同步/异步.阻塞/非阻塞: IO数量的角度:select出来之前,会阻塞在一个io上,处理完成后再阻塞在下一个io上:之后就是把所有的io fd拿过来,都不阻塞,一个 ...
- 编译nginx的时候报错 需要安装PCRE
./configure --prefix=/mynginx/ 本地编译nginx的时候 报错 提示需要安装PCRE 错误信息: ./configure: error: the HTTP rewrite ...
- python--封装Redis
Redis封装 import redis class MyRedis(): def __init__(self,ip,password,port=6379,db=1):#构造函数 ...