美文网首页
Block相关

Block相关

作者: 埃辛诺斯忍 | 来源:发表于2021-01-26 15:45 被阅读0次

    整理一下自己学到的知识,方便以后查看

    使用block时什么情况会发生引用循环,如何解决?

    一个对象中强引用了block,在block中又使用了该对象,就会发射循环引用。 解决方法是将该对象使用__weak或者__block修饰符修饰之后再在block中使用。

    • id weak weakSelf = self; 或者 weak __typeof(&*self)weakSelf = self该方法可以设置宏

    • id __block weakSelf = self;

    在block内如何修改block外部变量?

    默认情况下,在block中访问的外部变量是复制过去的,即:写操作不对原变量生效。但是你可以加上__block来让其写操作生效,示例代码如下:

    __block int a = 0;
    void  (^foo)(void) = ^{ 
        a = 1; 
    }
    f00(); 
    //这里,a的值被修改为1
    

    使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?

    系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑:

    所谓“引用循环”是指双向的强引用,所以那些“单向的强引用”(block 强引用 self )没有问题,比如这些:

    [UIView animateWithDuration:duration animations:^{ [self.superview layoutIfNeeded]; }]; 
    [[NSOperationQueue mainQueue] addOperationWithBlock:^{ self.someProperty = xyz; }]; 
    [[NSNotificationCenter defaultCenter] addObserverForName:@"someNotification" 
                                                      object:nil 
                               queue:[NSOperationQueue mainQueue]                                              usingBlock:^(NSNotification * notification) {
                                                        self.someProperty = xyz; }];
    

    这些情况不需要考虑“引用循环”。

    但如果你使用一些参数中可能含有 ivar 的系统 api ,如 GCD 、NSNotificationCenter就要小心一点:比如GCD 内部如果引用了 self,而且 GCD 的其他参数是 ivar,则要考虑到循环引用:

    __weak __typeof__(self) weakSelf = self;
    dispatch_group_async(_operationsGroup, _operationsQueue, ^
    {
    __typeof__(self) strongSelf = weakSelf;
    [strongSelf doSomething];
    [strongSelf doSomethingElse];
    } );
    

    类似的:

    __weak __typeof__(self) weakSelf = self;
      _observer = [[NSNotificationCenter defaultCenter] addObserverForName:@"testKey"
                                                                    object:nil
                                                                     queue:nil
                                                                usingBlock:^(NSNotification *note) {
          __typeof__(self) strongSelf = weakSelf;
          [strongSelf dismissModalViewControllerAnimated:YES];
      }];
    

    self --> _observer --> block --> self 显然这也是一个循环引用

    相关文章

      网友评论

          本文标题:Block相关

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