美文网首页
iOS知识梳理9:block块

iOS知识梳理9:block块

作者: 大布溜 | 来源:发表于2017-09-11 16:20 被阅读10次

    (ps.本文提到有typedef和typeof)

    block是带有自动变量的匿名函数.

    • 匿名函数
      匿名函数顾名思义就是不带名字的函数,在C语言中不允许这样的方法存在,而在OC中的Block则可以用指针来直接调用一个函数。
    • 自动变量
      block可以截获变量的瞬时值....截获的变量可以进行操作而不能进行赋值.
      block中不能再改变变量的值.....如果需要改变变量的值需要在变量声明时加上__Block修饰符.
      block不支持C语言数组.
    block语法

    一个完整的block

     ^ NSString *(NSString *a,NSString *b){
            return a;
        };
    

    "^" block标识......."NSString *"返回值...."(NSString *a,NSString *b)"参数列表..
    其实我们可以直接省略返回值....没有参数的时候也可以省略返回值.

    ^ {
            NSLog(@"hello world");
       };
    
    block变量

    其实就是一个指向block的指针.

    int (^blockName)(int arg1,int arg2);
    

    我们可以通过等号赋值直接给block变量赋值,

    int (^blockName)(int arg1,int arg2) = ^(int arg1, int  arg2){
          return arg1 + arg2;
    };
    
    block当作函数参数

    我们可以先声明一个block变量.并加上typedef标识符
    (typedef表示为已知的类型起别名,在这里表示为block取一个叫MyBlock的别名,这样我们再定义这个block类型是就可以直接用Myblock,而不必加上其他额外的东西)

    typedef void (^MyBlock)(NSString *s1,UIColor *c);
    

    我们来声明一个函数:

    -(void)func:(MyBlock)block{
               block(@"str",[UIColor redColor]);
    }
    

    我们可以使用这个函数:

    [self func:^(NSString *s1, UIColor *c){
            NSLog(@"%@",s1);
            self.view.backgroundColor = c;
    }];
    
    循环引用问题

    block在ios开发中被视为一个对象....由于block的捕获变量的机制...使得block的对象也有可能被block持有,从而形成循环应用,导致两者都不能被释放...
    如下,

    @implementation LXDObject
    {
        void (^_cycleReferenceBlock)(void);
    }
    - (void)viewDidLoad
    {
        [super viewDidLoad];
        _cycleReferenceBlock = ^{
            NSLog(@"%@", self);   //引发循环引用
        };
    }
    @end
    

    我们可以通过__weak关键字来修饰变量,解决循环引用问题

    __weak typeof(*&self) weakSelf = self;
    _cycleReferenceBlock = ^{
        NSLog(@"%@", weakSelf);   //弱指针引用,不会造成循环引用
    };
    

    (typeof可以根据括号内的变量,自动识别变量类型并返回该类型)

    相关文章

      网友评论

          本文标题:iOS知识梳理9:block块

          本文链接:https://www.haomeiwen.com/subject/bnkvjxtx.html