------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
block封装了一段代码,可以在任何时候执行
block可以作为函数参数的返回值,而其本身又可以带输入参数和返回值
int(^sum)(int,int)=^(int a, int b){
return a+b;
}
void main(){
int s=sum(2,5);//取出block定义的值
NSLog(@“s=%i”,s);
}
还可以用typedef定义:
typedef int(^Sum)(int,int);
Sum s=^(int x,int y){
return x-y;
}
Sum s2=^(int x,int y){
return x+y;
}
这样定义block可以不用限次的使用
block可以使用外部定义的变量,但不能改变外部变量的值,如果想改变可以使用关键字__block(两个下划线)
__block int a=10;
Sum s=^(int x,int y){
a=6;
NSLog(@"a=%i",a);
return 0;
}
打印结果为 a=6
block对比 指向函数的指针:
typedef void(*sum)(int,int) ;
typedef int(^sump)(int,int,minus);
两个在typedef定义时 只一个符号之差
block使用
sum s=^(int a,int b){
return a+b;
}
指向函数的指针使用
要先找到与定义相匹配的类型函数
int sum(int a,int b,int*minus){
*minus=a-b;
return a+b;
}
void mian(){
int minus;
(*)sump=sum;//指针指向了函数
//也可以写成sump=sum;
int s=int(*)sump(10,8,&minus)
NSLog(@"a+b=%i",s);
NSLog(@"a-b=%i",minus);
}
另外block也可以快速遍历 数组,字典 。
反射:
通过类名的字符串形式实例化对象
Class class="NSClassFormString"(@"Teacher");
Teacher *tea=[[[class alloc] init] autorelease];
类名变成字符串
NSString *str=NSStringFormClass(class);
方法反射:
通过方法名的字符串形式实例化对象
SEL selector=NSSelectorFormString(@"Test");
[Teacher performSelector:selector)];
反射成字符串输出
NSStringFormSelector(selector);
黑马程序员——OC学习总结--block和反射机制
原文:http://www.cnblogs.com/qiang0901/p/4469735.html