黑马程序员——OC学习总结--block和反射机制

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);

 

posted @ 2015-04-30 20:05  强子0901  阅读(227)  评论(0编辑  收藏  举报