1.如图:
使用delegate,会出现事件的发起和处理的分离;
而使用block,实现事件的发起和处理在一起。代码更紧凑,更容易管理。
2.block
block是一个函数体(匿名函数),它是OC对于闭包的实现,在块状中我们可以持有和引用局部变量,童年故事可以将一个操作作为一个参数进行传递(C中函数指针),
完成数据回调的功能。
3.block的定义、使用、作为函数参数如代码
4.注意事项:
(1)Block类似于int,是一种类型(匿名函数),定义一个block就类似于定义一个函数。
(2)block在定义时不会执行{}之间的代码块,在调用blcok之后才执行,完成两个类之间的回调。实现数据回调的方式是将声明和实现作为一个整体当做函数的参数传递过去。
(3)看到^就表示是一个block。
//
// main.m
// Block定义
//
// Created by Baocloud-iMac8 on 15/8/2.
// Copyright (c) 2015年 宝擎教育. All rights reserved.
//
#import <Foundation/Foundation.h>
void testBlock1(){
//int a = 10;
NSLog(@"1");
//定义一个没有参数 没有返回值的block
//block在定义的时候不会执行{}之间的内容
//当调用这个block的时候才会执行{}之间的内容
void (^blockName)() = ^(){
//block具体的执行部分
int a = 20;
NSLog(@"2");
};
NSLog(@"3");
//调用block
blockName();
NSLog(@"4");
//打印出来的是1324
}
void testBlock2(){
//返回值为int 需要两个参数的block
int (^addBlock)(int, int) = ^(int a, int b){
return a + b;
};
NSLog(@"1 + 2 = %d", addBlock(1,2));
}
void testBlock3(){
__block int a = 10;
int b = 20;
//block在运行的时候会拷贝一份当前的上下文
//重新拷贝一份到堆上去,所以运行在堆上,已经和主线程脱离了,所以不能改变block外部的变量的值 (如图)
//但是可以访问外部变量的值(这个时候访问的变量已经不是原来那个变量了,是block的一份拷贝)
//如果确实是想改变外部变量的值 那么就用一个关键字__block修饰这个变量
void (^block)() = ^(){
a = 10;
NSLog(@"a + b = %d", a + b);
};
block();
}
typedef void (^ComlishBlock)(int a, int b);//第三种 typedefine类型重定义,自动设定ComlishBlock为名字
//将block作为函数的参数
//void doSomething(void (^ComlishBlock)(int, int)){
// ComlishBlock(1,5);
//}
void doSomething(ComlishBlock block){
block(1, 3);
}
int main(int argc, const char * argv[]) {
@autoreleasepool {
//int a = 10;
/*第一种 比较麻烦 定义和调用是分离的
void (^ComlishBlock)(int, int) = ^(int a, int b){
NSLog(@"a + b = %d", a + b);
};
doSomething(ComlishBlock);
*/
doSomething(^(int a, int b) { //第二种 粘合在一起,不去单独定义block了,传参的时候定义,直接调用dosomething函数传block里的参数
NSLog(@"a + b = %d", a+b);
});
}
return 0;
}