什么是Block?
Block是ios中一种比较特殊的数据类型,是苹果官方特别推荐使用的一种数据类型,应用场景有:动画、多线程、集合遍历、网络请求回调等
Block的作用:用来保存某一段代码,可以在恰当的时间取出来再调用。
Block的基本使用:
//
// main.m
// Block的基本使用
//
// Created by XinYou on 15-5-8.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
/**
* 定义一个没有返回值、没有参数的block
*/
void test_1(){
// 定义block
void (^helloWorld)() = ^{
NSLog(@"Hello World");
};
// 执行block
helloWorld();
}
/**
定义了一个没有返回值 但有参数的block
*/
void test_2()
{
// 定义block,该block能打印任意行数的 Hello World
void (^helloWorld)(int) = ^(int count){
for (int i = 0; i < count; i++) {
NSLog(@"Hello World");
}
};
// 执行block
helloWorld(5);
}
/**
定义了一个有返回值、有参数的block
*/
void test_3(){
// 定义block,该block用于求和
int (^sumBlock) (int, int) = ^(int a, int b){
return a + b;
};
// 执行block
int sum = sumBlock(8, 9);
/*
block还可以这样写:
int (^myBlock) (int, int);
myBlock = ^(int a, int b){
return a -b;
};
*/
NSLog(@"%d", sum);
}
int main(int argc, const char * argv[])
{
@autoreleasepool {
// test_1();
// test_2();
test_3();
}
return 0;
}
Block和typedef(给Block定义别名):
//
// main.m
// Block和typedef
//
// Created by XinYou on 15-5-8.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
// 使用typedef给基本数据类型取别名
typedef int MyInt;
// 使用typedef给block取别名
typedef int (^MyBlock)(int, int);
int main(int argc, const char * argv[])
{
@autoreleasepool {
/*
int (^minusBlock) (int, int) = ^(int a, int b){
return a - b;
};
int (^multiBlock) (int, int) = ^(int a, int b){
return a * b;
};
*/
// 以上代码跟下面的代码效果一样,但是下面的代码更简洁
MyBlock minusBlock = ^(int a, int b){
return a - b;
};
MyBlock multiBlock = ^(int a, int b){
return a * b;
};
NSLog(@"%d", minusBlock(10, 7));// 打印结果:3
NSLog(@"%d", multiBlock(8, 7));// 打印结果:56
}
return 0;
}
Block的应用场景:
//
// main.m
// Block的应用场景
//
// Created by XinYou on 15-5-8.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
/**
* 新入职一家公司,模拟前3天要做的事情
*/
/***************************************最原始的做法begin*********************************/
// 第一天去上班要做的事情
void doWorkOfFirstDay(){
NSLog(@"起床、刷牙、穿衣服穿鞋");
NSLog(@"出门、搭公交");
NSLog(@"抵达公司");
/********************/
NSLog(@"了解项目的需求");
/********************/
NSLog(@"叮咚叮咚 下班了");
NSLog(@"搭公交");
NSLog(@"回家");
NSLog(@"睡觉");
}
// 第二天去上班要做的事情
void doWorkOfSecondDay(){
NSLog(@"起床、刷牙、穿衣服穿鞋");
NSLog(@"出门、搭公交");
NSLog(@"抵达公司");
/********************/
NSLog(@"熟悉公司以前的代码");
/********************/
NSLog(@"叮咚叮咚 下班了");
NSLog(@"搭公交");
NSLog(@"回家");
NSLog(@"睡觉");
}
// 第三天去上班要做的事情
void doWorkOfThirdDay(){
NSLog(@"起床、刷牙、穿衣服穿鞋");
NSLog(@"出门、搭公交");
NSLog(@"抵达公司");
/********************/
NSLog(@"开始编写代码");
/********************/
NSLog(@"叮咚叮咚 下班了");
NSLog(@"搭公交");
NSLog(@"回家");
NSLog(@"睡觉");
}
/***************************************最原始的做法end*********************************/
/***************************************改进后的做法begin*********************************/
void workBefore(){
NSLog(@"起床、刷牙、穿衣服穿鞋");
NSLog(@"出门、搭公交");
NSLog(@"抵达公司");
}
void workAfter(){
NSLog(@"叮咚叮咚 下班了");
NSLog(@"搭公交");
NSLog(@"回家");
NSLog(@"睡觉");
}
// 第一天去上班要做的事情
void doWorkOfFirstDay_1(){
workBefore();
/********************/
NSLog(@"了解项目的需求");
/********************/
workAfter();
}
// 第二天去上班要做的事情
void doWorkOfSecondDay_1(){
workBefore();
/********************/
NSLog(@"熟悉公司以前的代码");
/********************/
workAfter();
}
// 第三天去上班要做的事情
void doWorkOfThirdDay_1(){
workBefore();
/********************/
NSLog(@"开始编写代码");
/********************/
workAfter();
}
/***************************************改进后的做法end*********************************/
/***************************************Block的做法begin*********************************/
void doWorkOfOneDay(void (^work)()){
NSLog(@"起床、刷牙、穿衣服穿鞋");
NSLog(@"出门、搭公交");
NSLog(@"抵达公司");
/********************/
if (work != nil) {// 一定要判空,不然当block为nil,程序会奔溃
work();
}
/********************/
NSLog(@"叮咚叮咚 下班了");
NSLog(@"搭公交");
NSLog(@"回家");
NSLog(@"睡觉");
}
// 第一天去上班要做的事情
void doWorkOfFirstDay_2(){
doWorkOfOneDay(^{
NSLog(@"了解项目的需求");
});
}
// 第二天去上班要做的事情
void doWorkOfSecondDay_2(){
doWorkOfOneDay(^{
NSLog(@"熟悉公司以前的代码");
});
}
// 第三天去上班要做的事情
void doWorkOfThirdDay_3(){
doWorkOfOneDay(^{
NSLog(@"开始编写代码");
});
}
/***************************************Block的做法end*********************************/
int main(int argc, const char * argv[])
{
@autoreleasepool {
doWorkOfFirstDay_2();
doWorkOfSecondDay_2();
doWorkOfThirdDay_3();
}
return 0;
}
Block的注意事项:
//
// main.m
// Block使用注意
//
// Created by XinYou on 15-5-8.
// Copyright (c) 2015年 vxinyou. All rights reserved.
//
#import
typedef void (^MyBlock) ();
int main(int argc, const char * argv[])
{
@autoreleasepool {
int a = 10;
__block int b = 10;
MyBlock block = ^{
// 下面这行会报错,默认情况下,block内部不能修改外部的局部变量
// a = 20;
// 下面这行是正确的,被__block修饰的局部变量,可以在block内部修改
b = 20;
NSLog(@"a = %d", a);// 虽然不能修改,但是可以访问
NSLog(@"b = %d", b);
};
block();
}
return 0;
}