定义block
无参数无返回值的block 定义格式:
void (^block)() = ^{
NSLog(@"block");
};
有参有返回值的block 定义格式
int (^sum)(int,int) = ^(int a,int b){
return a+b;
};
当然如果block作为成员属性的时候 定义的格式如下:
@property (nonatomic, copy) void(^myBlock)(); //注意这个是block作为成员属性的时候的定义格式
当然这里如果block作为成员属性 我们可以使用typedef为这个block起一个别名 这样就不用每次都写这么长的代码了:
如:
typedef void(^myBlock)() //这样就相当于给这个block起了一个别名 叫做 myBlock 那么以后使用的时候 就可以这样使用:
@property (nonatomic, copy) myBlock block; //注意这个是block作为成员属性的时候的定义格式
当block当做参数传递的时候用如下格式:
+ get:(NSString*)url parames:(NSDictionary*)parames success:(int (^)(int,int))sum; //这个block是一个有参数有返回值的
+ post:(NSString*)url parames:(NSDictionary*)parames success:(void (^)(id responseObj))responseObj; //这个block是一个有参数 没有返回值的
即可:也就是说block当做参数的时候 需要把block的名字提取出来放到最后面即可
block其他注意点:
由于Block是默认建立在栈上, 所以如果离开方法作用域, Block就会被丢弃,
在非ARC情况下, 我们要返回一个Block的话,需要 [Block copy];
在ARC下, 以下几种情况, Block会自动被从栈复制到堆:
1.被执行copy方法
2.作为方法返回值
3.将Block赋值给附有__strong修饰符的id类型的类或者Blcok类型成员变量时
4.在方法名中含有usingBlock的Cocoa框架方法或者GDC的API中传递的时候
__weak BlockDemo
*demo = [[BlockDemo
alloc]init];
BlockDemo *demo = [[BlockDemo alloc]init];
__weak typeof(BlockDemo) *weakDemo = demo;