一、block的基本概念
1)block对象是一个C级别的语法和运行机制,它与标准的C函数类似,不同之处在于,它除了有可执行代码以外,它还包含了与堆、栈内存绑定的变量。因此,block对象包含着一组状态数据。这些数据在程序执行时用于对行为产生影响。
2)你可以用block来写一些可以传到API中的函数语句,可选择性的存储,并可以使用多线程,作为一个回调,block特别的游泳,因为block既包含了回调期间的代码,又包含了执行期间需要的数据。
3)由于objective-C和C++都是衍生自C,block被设计为可同时兼容这三种语言
2、block的基本用法
用【^】操作符来表明一个block变量,并指明block语句的开始,block的主题部分包含在【{}】内,像下面的例子中一样.
3、应用举例
//1、有参有返回值
int (^blockName1)(int,int) = ^(int num,int a){
return num*a;
};
//2、无参无返回值,bolck名后的()为空
void (^blockName2)() = ^(){
NSLog(@"blockName2 :Iam amos");
};
//3、有参无返回值
void (^blockName3)(NSString*) = ^(NSString* str){
NSLog(@"blockName3:value = %@",str);
};
//4、无参有返回值
NSString* (^blockName4)() = ^{
return @"blockName4";
};
//5、block变量的使用
NSLog(@"blockName1value = %d",blockName1(2,5));
blockName2();
blockName3(@"I am 24 years old");
NSLog(@"%@",blockName4());
//6、以上都是先定义一个变量同时赋值,其实一个block就相当于一个变量
//也可以先定义再赋值,如下
blockName1 = ^(int a, int b){
int m = a > b ? a : b;
NSLog(@"max = %d", m);
return m;
};
blockName1(2,5);
打印结果:
2015-10-07 14:05:47.335分类扩展[1154:303] blockName1value = 10
2015-10-07 14:05:47.337分类扩展[1154:303] blockName2 :Iam amos
2015-10-07 14:05:47.338分类扩展[1154:303] blockName3:value = I am 24 years old
2015-10-07 14:05:47.339分类扩展[1154:303] blockName4
2015-10-07 14:05:47.339分类扩展[1154:303] max = 5
【结果分析】
从上述例子可以看出,可以很方便的给block变量赋值,可以动态的绑定方法。
二、block的typedef
1、函数指针
定义格式:
返回类型 (*函数指针名)(参数列表);
【技巧】
1)把函数的声明拷贝过来
2)把函数名换成 (*函数指针变量名)
3)形参名可以不写
【好处】
可以灵活的使用p调用不同的方法
【使用举例】
int add(int a, int b){
return a + b;
}
int sub(int a, int b){
return a - b;
}
int main(int argc, const char * argv[])
{
//定义一个函数指针
int (*p)(int,int);//int (*p)(int a,int b);也行,可以省略参数名
//给函数指针赋值
p = add;
//使用函数指针
int c = p(1,2);
NSLog(@"c = %d",c);
//也可以这样使用
p = sub;//使函数指针指向另一个方法
c = (*p)(2,1);
NSLog(@"c = %d",c);
return 0;
}
打印结果:
2015-10-07 14:35:42.955加强02[1231:303] c = 3
2015-10-07 14:35:42.957加强02[1231:303] c = 1
【给函数指针取别名】
取别名格式:
typedef返回类型 (*新类型名)(参数列表);
【用别名定义函数指针格式】新类型名指针变量名;
上述代码可以有如下改动,其他不用变
//定义一个函数指针
typedef int(*Func)(int,int);//int (*p)(int a,int b);也行,可以省略参数名
//给函数指针赋值
Func p= add;
2、block的typedef
【格式】
typedef返回值类型 (^newBlockTypeName)(参数列表);
【例子】
typedefint (^myBlock)(int,int);
【应用举例】
//【格式】typedef返回值类型 (^newBlockTypeName)(参数列表);
//定义一个有参有返回值的block的别名
typedef int (^myBlock)(int, int);
//此时myBlock是一个类型,不再是一个单纯的变量了
myBlock b1 = ^(int a, int b){
return a + b;
};
NSLog(@"a + b = %d", b1(1,2));
打印结果:
2015-10-07 14:45:23.489加强02[1252:303] a + b = 3
三、block在OC类中的使用
1、block作为OC类成员变量
例如:
//无参的block作为OC对象的成员变量G
@property(nonatomic,copy) void (^myBlock)();
//有参的block作为OC对象的成员变量G
@property(nonatomic,copy) void (^myBlock2)(int a);
//无参有返回值的block作为OC对象的成员变量G
@property(nonatomic,copy) int (^myBlock3)();
2、block作为方法的参数使用
//block作为方法的参数使用
-(void)show:(void (^)()) myBlock{
myBlock();
}
也可以这样用
typedef void (^myBlock)();
//block作为方法的参数使用
-(void)show:(myBlock) mb{
mb();
}