使用系统的某些block api(如UIView的block版本写动画时),是否也考虑引用循环问题?
2017-03-14 00:00
393 查看
系统的某些block api中,UIView的block版本写动画时不需要考虑,但也有一些api 需要考虑:
所谓“引用循环”是指双向的强引用,所以那些“单向的强引用”(block 强引用 self )没有问题,比如这些:
这些情况不需要考虑“引用循环”。
但如果你使用一些参数中可能含有 ivar 的系统 api ,如 GCD 、NSNotificationCenter就要小心一点:比如GCD 内部如果引用了 self,而且 GCD 的其他参数是 ivar,则要考虑到循环引用:
类似的:
self --> _observer --> block --> self 显然这也是一个循环引用。
检测代码中是否存在循环引用问题,可使用 Facebook 开源的一个检测工具 FBRetainCycleDetector 。
所谓“引用循环”是指双向的强引用,所以那些“单向的强引用”(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版本写动画时),是否也考虑引用循环问题?
- 使用系统的某些block api(如UIView的block版本写动画时),是否也考虑循环引用问题?
- 最近在使用swift写代码时碰到block引用循环的问题。记下一笔以免忘记。
- iOS细节篇-block循环引用问题,和block安全使用方法
- Block使用中的一些疑问解答(包括循环引用问题的解决)
- MRC和ARC下使用block的循环引用问题
- iOS: ARC和非ARC下使用Block与循环引用问题
- Objective-c中block使用时的循环引用问题
- ios block循环引用问题
- block使用小结、在arc中使用block、如何防止循环引用
- Block的引用循环问题 (ARC & non-ARC)
- UIView基础动画(推荐多使用Block)---能实现很多效果,透明--不透明 缩放--从无到整 Block之间添加代码也就是开始动画与结束动画之间
- ARC下的block导致的循环引用问题解析
- Block的引用循环问题 (ARC & non-ARC)
- block使用小结、在arc中使用block、如何防止循环引用
- 代理的return怎么造成循环引用的,block的使用技巧
- block使用小结、在arc中使用block、如何防止循环引用
- block使用小结、在arc中使用block、如何防止循环引用
- ARC的基本使用、ARC循环引用解决方案、block、protoco 协议
- ARC下的block导致的循环引用问题解析