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

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

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