Block

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了!






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值