block块是在ios4开始,就出现了。block实质就是C语言的回调函数。block函数定义如下
void (^blockName)(int,int) = ^(int a,int b){};//void->返回值,blockName->block名字,(int,int)->block的参数,void (^blockName)(int,int) ->block声明,
^(int a,int b){};->block的定义,返回值和参数类型要一样。block能将代码变的简洁、清晰。block在开发中,当一个对象使用,就可以了。因为block对象的类归根揭底还是NSObject类。
block在开发当中,大多数都是这样使用的,例如typedef void(^HttpResponseSuccess)(idresponse,BaseResponeModel*model);。很少在使用的时候,在声明,不使用typedef声明一个block块的。
在arc情况下,如果定义block为一个对象的时候,属性使用copy,但是使用strong也是一样,因为在arc情况下,copy和strong是一样的,只不过,之前习惯这样写成copy属性。
void (^blockName)(int,int) = ^(int a,int b){//处理逻辑};
intmain(int argc,const char* argv[]) {
@autoreleasepool {
void(^block1)(void)= ^(){ };//NSGlobalBlock---是在数据区分配
int age =10;
void(^block)(int,int) = ^(inta,intb){
NSLog(@"%d,%d",a,b);
NSLog(@"%d",age);
};//NSMallocBlock--是在堆中分配,因为使用age的变量
void(^block2)(void) = ^{
NSLog(@"%d",age);
} ;
NSLog(@"%@======%@======%@",[block1 class],[block class],[^{
NSLog(@"%d",age);
}class]);//[^{NSLog(@"%d",age);}class]----NSStackBlock-->是在栈中分配
} return 0;
}
打印:__NSGlobalBlock__======__NSMallocBlock__======__NSStackBlock__
如果static int age =10;或extern int age =10;在block中只要使用age,就是在数据段分配了。__NSGlobalBlock__、__NSMallocBlock__、__NSStackBlock__都是class_t对象。