Block 是一个对象 它封装了一段代码,这段代码可以在任何时候执行。block可以作为函数参数或者函数的返回值,而其本身又可以带输入参数或返回值。
左右声明 右面实现
//块语法 无返回值 无参数类型
//void 返回值类型
//(^myBlock) 变量名
//前面声明
//右面实现 ^() 放参数类型
void (^myBlock)() = ^(){
};
myBlock();
//无返回值类型 有参数
void (^myBlock)(NSString *)=^(NSString * str){
NSLog(@"str===%@",str);
};
myBlock(@"wasd");
//无返回值类型 多参数
void (^myBlock)(NSString *,int)=^(NSString * str,int a){
NSLog(@"%@,%d",str,a);
};
myBlock(@"wasda",5);
//有返回值类型 带参数
int (^myBlock)(int) = ^(int a){
return a;
};
int b = myBlock(5);
block 属性声明
typedef void (^ReturnValueBlock) (id returnValue);
@property (strong, nonatomic) ReturnValueBlock returnBlock;
// 传入交互的Block块
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock;
实现部分
-(void) setBlockWithReturnBlock: (ReturnValueBlock) returnBlock
{
//将传递的block 接收属性block 这样调用的时候就会响应对应的方法
_returnBlock = returnBlock;
}
//调用
block响应就会找到对应的方法实现 方法传值
self.returnBlock(array);
MyorderViewModel * model = [[MyorderViewModel alloc] init];
[model setBlockWithReturnBlock:^(id returnValue) {
}
属性传值
model.returnBlock =
^(id returnValue) {
}
__block __weak
1.__block不管是ARC还是MRC模式下都可以使用,可以修饰对象,还可以修饰基本数据类型。
2.__weak只能在ARC模式下使用,也只能修饰对象(NSString),不能修饰基本数据类型(int)。
3.__block对象可以在block中被重新赋值,__weak不可以。
block 内部使用外部变量的值 就是拷贝一份 这样在block内部修改值 是无法改变外部变量的值 (因为拷贝更换了地址)所以添加__block
__block声明的局部变量 可以在block中修改
循环引用
当砸在block内部使用属性的时候 block 就会对self进行强引用 如果blcok 是self的一个属性的时候 这样就会造成 self引用block block引用self 这样就造成了循环引用的问题
解决方法
ARC环境下
__weak
typeof
(self) weakSelf = self;
MRC环境下:解决方式与上述基本一致,只不过将__weak关键字换成__block即可,这样的意思是告诉block:小子,不要在内部对self进行retain了!