美文网首页ios面试题
使用系统的某些block api(如UIView的block版本

使用系统的某些block api(如UIView的block版本

作者: 充满活力的早晨 | 来源:发表于2018-04-10 10:26 被阅读74次

    系统的某些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 显然这也是一个循环引用。

    检测代码中是否存在循环引用问题,可使用 Facebook 开源的一个检测工具 FBRetainCycleDetector 。

    相关文章

      网友评论

        本文标题:使用系统的某些block api(如UIView的block版本

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