block语法的实现与c语言中的函数指针原理相同,下面我们先来看看什么是函数指针。
1. c 语言函数指针
a. 无返回值的函数
void (*p)(void) // p函数指针的变量名称,后面的参数列表只写参数的数据类型而不用写参数名称
p的数据类型为 void(*)(void)
p = test;
p();
void test(void)
{
nslog(@"我是一个C语言普通函数");
}
b. 有返回值的函数
int sum(int,int); //函数的声明部分 参数名称可以缺省 但是参数的数据类型不能缺省
int sum(int a,int b)
{
return a+b; //函数的实现部分 参数名不能缺省
}
int (*q)(int,int);
q = sum;
nslog(@"%@",q(3,4));
c. typedef为数据类型起别名
typedef int myInt; myInt s = 1;
typedef nsstring * (*y) (int,nsstring *);
//y就是nsstring * (*)(int,nsstring *)的别名
y pointFun = appending;
//y指向返回值类型为nsstring * ,参数类型为(int,nsstring *)这样的函数
2. block语法
它的定义格式与函数指针完全相同。函数指针使用 * 标识,而block变量使用的是 ^ 标识
a. 定义返回值类型为空 参数类型也为空的block变量
定义格式: 返回值类型(^变量名)(参数列表)
void (^myBlock)(void);
//变量名为myBlock 数据类型为void(^)(void)
为block变量赋值
赋值格式: ^返回值类型(参数列表) 参数列表必须带有参数名称
myBlock = ^void(void){
nslog(@”我是普通的Block变量”);
};
【注意】myBlock变量赋值以后 不会直接执行 {} 中的代码 必须加上下面代码
打印block语句块的内容
myBlock(); //block指向的函数的调用
myBlock = ^(void){
nslog(@“block函数返回值为void类型 可以缺省”);
};
myBlock();
myBlock = ^{
nslog(@“block函数的从参数为void类型那么参数部分可以缺省”);
};
myBlock();
b. 定义返回值类型为nsstring * , 参数为int ,nsstring *
nsstring * (^yourBlock)(int,nsstring *);
yourBlcok = ^ nsstring * (int a,nsstring * s){
return [nsstring stringwithformat:@”%d,%@”,a,s];
};
nsstring * stringAll = yourBlock(100,@”元”);
nslog(@”%@”,stringAll);
c. 求连个数的和
int (^sum) (int,int);
sum = ^ int (int a,int b){
return a + b;
};
nslog(@”%d”,sum(10,30));
d. 使用typedef为block类型起别名
typedef int(^hisBlock)(int,int);
//使用hisBlock替代 int (^)(int,int)类型
hisBlock block = ^int(int a,int b){
return a-b;
};
nslog(@”%d”,block(9,1));
e. block变量之间可以相互赋值
hisblock block1 = block;
f. block变量作为函数的形参
这里首先要新建一个类 Custom
在custom.h 中声明一个 实例方法 -(void)testInfo;
在custom.m中实现该方法
typedef nsstring * (^ourBlock)(nsstring ,nsstring );
-(void)testInfo
{
void (^myblock)(void);
myblock = ^{
nslog(@”六一快乐”);
};
[self runoneblock:myblock];
int (^ yourblock)(int ,int);
yourblock = ^int(int a,int b){return a+b };
//yourblock的数据类型为 int(^)(int,int)
[self runtwoblock:yourblock];
-(void)runoneblock:(void(^)(void))block
{
block();
}
-(void)runtwoblock:(int(^)(int,int))block
{
nslog(@"%d",block(10,20));
}
Block传值问题: 把后一界面的值传到前一个界面 利用的是赋值时 {}中的语句 不会立即调用
假如后一界面视图 nextviewcontroller
typedef void(^myblock)(uicolor *);
//block变量作为类的成员变量 属性修饰符只能使用copy
@property (noatomic,copy) myblock blocktemp;
......
当遇到点击事件时
-(void)pressBtn:(id)sender
{
self.blocktemp([uicolor greencolor]);
//block变量对应的语句块只用调用的block变量的时候才会被使用
。。。
}
在前面一个视图中 当点击按钮时,跳到后一界面 并为后一视图的成员变量tempblock赋值
-(void)pressBtn:(id)sender
{
nextviewcontroller * next = [[nextviewcontroller alloc]init];
next.blocktemp = ^(uicolor * color){
self.view.backgroundcolor = color;
…………………………………………
};
}