Block的用法

时间:2023-01-15 06:05:43

定义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中传递的时候
 
在非ARC下,只虽一个__block关键词就可以解决循环引用的问题。相对还是简单的。
 
那么在arc模式下 如何解决循环引用的问题呢?
 
很多人以为写个__weak就行了
 
 __weak BlockDemo *demo = [[BlockDemo alloc]init];
如果你这样写 那就犯了很大的错误: 这样定义一个变量  马上就被release 了  如果有
 
解决方法是这样的:
BlockDemo *demo = [[BlockDemo alloc]init];   
__weak typeof(BlockDemo) *weakDemo = demo;
 
注意:
当一个对象中的block块中的访问自己的属性是不会造成循环引用的,因为把自身当作参数传到block中的时候,编译器给我们做了弱引用。因此不会产生循环引用。