首页 > Windows开发 > 详细

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

时间:2017-09-13 20:03:45      阅读:332      评论:0      收藏:0      [点我收藏+]
  • 系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑
  • 以下这些使用方式不会引起循环引用的问题
[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; }];
  • 但如果方法中的一些参数是 成员变量,那么可以造成循环引用,如 GCD 、NSNotificationCenter调用就要小心一点,比如 GCD 内部如果引用了 self,而且 GCD 的参数是 成员变量,则要考虑到循环引用,举例如下:

    • GCD

      • 分析:self-->_operationsQueue-->block-->self形成闭环,就造成了循环引用
        __weak __typeof__(self) weakSelf = self;
        dispatch_group_async(_operationsGroup, _operationsQueue, ^
        {
        [weakSelf doSomething];
        [weakSelf doSomethingElse];
        } );
        
    • NSNotificationCenter

      • 分析:self-->_observer-->block-->self形成闭环,就造成了循环引用
      __weak __typeof__(self) weakSelf = self;
      _observer = [[NSNotificationCenter defaultCenter]
      addObserverForName:@"testKey"
      object:nil
      queue:nil
      usingBlock:^(NSNotification *note){
          [weakSelf dismissModalViewControllerAnimated:YES];
      }];

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

原文:http://www.cnblogs.com/huangzs/p/7516715.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!