您的位置:首页 > 其它

Block

2016-03-21 09:49 246 查看
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了!
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: