IOS 块 和 C 函数指针

来源:互联网 发布:android 拦截网络请求 编辑:程序博客网 时间:2024/05/29 18:25
函数指针的声明方法为:
函数类型 (标志符 指针变量名) (形参列表);
“函数类型”说明函数的返回类型,
“(标志符 指针变量名 )”中的括号不能省,若省略整体则成为一个函数说明,说明了一个返回的数据类型是指针的函数,
后面的“形参列表”表示指针变量指向的函数所带的参数列表。
例如:
int func(int x); /* 声明一个函数 */
int (*f) (int x); /* 声明一个函数指针 */
f=func; /* 将func函数的首地址赋给指针f */
赋值时函数func不带括号,也不带参数,由于func代表函数的首地址,因此经过赋值以后,指针f就指向函数func(x)的代码的首地址。

一个代码块可以简单看作是一组可执行的代码。
例如:
^ {
NSLog(@"Hello!... ...");
};
插入符号(^)声明一个代码块的开始,一对大括号{}构成了代码块的体部。你可以认为代码块与一个匿名函数类似。那么,如果是一个匿名的函数,我们该怎么调用这个代码块呢?最常见使用代码块的方式是将其传入方法中供方法回调,就像之前我们经常见到的view animations 。另一种使用代码块的方式是将其赋予代码块变量,然后可使用该变量来直接调用代码块。
以下是如何声明我们的代码块并将它赋予代码块变量sayWord:
void (^sayWord)(void) = ^ {
NSLog(@"Hello!... ...");
};
使用的时候该怎么办呢?
我们直接    sayWord(); //有惊喜


代码块变量之前有^符号并被小括号包着,代码块变量有类型定义的。因此,上面的sayWord变量可以应用任何无参,无返回值的代码块。
于是我们可以
void (^sayWord)(void) = ^ {
NSLog(@"Hello!... ...");
NSLog(@"Hello!... ...");
NSLog(@"Hello!... ...");
};
我们直接  sayWord(); //有惊喜

有参数怎么办呢??
void (^sayWord)(NSString*,NSString*) = ^ (NSString *name,NSString *address){
NSLog(@"name is %@",name);
NSLog(@"address is %@",address);
};
OK ,我们直接  sayWord(“name”,“address”);//同样有惊喜
有参数,有返回值呢??
说一下  这个返回值你最好不要加()  比如 (int) (^add)(int,int) = ^ (int i,int j){
return i+j;
};
应该这样
int (^add)(int,int) = ^ (int i,int j){
return i+j;
};
其实意思就是前半句声明了一个名字为add的代码块,有2个int类型的参数,并返回一个int类型的值;后面的半句就是一个块的定义,然后赋值给add。
OK ,我们直接  NSLog(@“result is %d”,add(3,4));//同样也有惊喜
///
注意了:
如果想在block中修改局部变量,你需要在局部变量前加__block!!
__block int m=10;
int (^add)(int,int) = ^ (int i,int j){
return i+j+m;
};

不知道你们明白没有?