如何解决 block 循环引用的问题
2016-03-30 21:10
501 查看
我们用block 的时候,由于内存没有释放,导致循环引用,其实很简单,只有我们用_weak 就解决了 贴代码了
#import "DetailViewController.h" @interface DetailViewController () @end @implementation DetailViewController - (void)viewDidLoad { [super viewDidLoad]; [[NSNotificationCenter defaultCenter] addObserverForName:@"key" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) { [self notification]; }]; } - (void)notification { NSLog(@"%@", NSStringFromSelector(_cmd)); } - (void)dealloc { NSLog(@"%@", NSStringFromSelector(_cmd)); } @end当DetailViewController返回上个VC时,发现DetailViewController没有执行dealloc方法释放内存,这就形成了内存泄露。主要由于NSNotificationCenter的block一直持有self,形成了强引用。
2 ARC模式解决循环引用
ARC模式下使用__weak解决循环引用。- (void)viewDidLoad{[super viewDidLoad];__weak DetailViewController *wSelf = self;[[NSNotificationCenter defaultCenter] addObserverForName:@"key" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {[wSelf notification];}];}
2 ReactiveCocoa解决循环引用。
我们可以使用第三方库ReactiveCocoa解决循环引用。#import "RACEXTScope.h"- (void)viewDidLoad{[super viewDidLoad];@weakify(self);[[NSNotificationCenter defaultCenter] addObserverForName:@"key" object:nil queue:nil usingBlock:^(NSNotification * _Nonnull note) {@strongify(self);[self notification];}];}当然第三种方法,你需要导入
ReactiveCocoa
相关文章推荐
- iOS离屏绘制的性能和机制分析
- iOS图形处理和性能
- [iOS]block
- IOS中Json解析的四种方法
- [iOS]MRC和ARC
- iOS开发之plist文件的获取
- GCD中的dispatch_group函数的详解
- iOS开发之tableViewCell高度自适应
- 对于IOS9调用系统相机和视频软件隐藏状态栏的问题
- iOS开发之block的使用
- iOS之block(下)
- iOS之block(上)
- ios中去除tableView的分割线
- IOS用CGContextRef画各种图形
- iOS开发中@selector的理解与应用
- iOS个人整理36-即时通信2 XMPP 好友列表 聊天信息
- 关于ios不同版本间的内存管理差异和iso6与以前版本内存管理的兼容
- iOS KVC & KVO
- 直接改应用!Flipboard开源iOS应用内调试工具FLEX
- iOS 7 新特性:视图控制器切换API