学而时习之,不亦乐乎,大家好,我是张杰。
关于通知NSNotificationCenter基本每个项目都会用到,其创建和销毁也有一些固有的模式,今天讲一下我遇到的通知被多次注册不能销毁的问题。
首先注册通知:
- (void)viewDidLoad {
[super viewDidLoad];
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(refreshTableView:) name:@"OrderViewController" object:nil];
}
然后销毁:
- (void)dealloc {
[[NSNotificationCenter defaultCenter] removeObserver:self name:@"OrderViewController" object:nil];
}
场景:反向传值,我在其他页面处理了业务返回到这个页面的时候需要看需求刷新
正常情况下通知的代理方法只会走一次,可以这个走了多次,次数不定,我就想到应该是通知多次注册没有销毁了,在(void)dealloc打断点发现的确VC没有释放。
谨记:注册了通知一定要断点看看是否在该销毁的地方被销毁了。
为什么没被销毁:
1.VC中是否存在NSTimer?计时器是否销毁?
2.VC中的有关代理是否使用assign修饰?
3.VC中的block是否循环引用?
解决:
第一种: controller中使用了计时器 NSTimer 使用后没有销毁 导致循环引用
self.playerTimer = [NSTimerscheduledTimerWithTimeInterval:1target:selfselector:@selector(playProgressAction)userInfo:nilrepeats:YES];
使用后记得销毁
[_playerTimerinvalidate];
_playerTimer =nil;
第二种:协议delegate 应该使用weak修饰,否则会引起循环引用 不能释放内存
@property (nonatomic,weak)id<zhangjieDelegate>delegate;
第三种:使用到block的地方,,block回调中不能直接使用self 否则可能引起循环引用。
__weak OrderViewController *weakself = self;
self.tableview.mj_header = [MJRefreshNormalHeader headerWithRefreshingBlock:^{
//进行数据刷新操作
weakself.dataArr = [NSMutableArray new];
weakself.index = 1;
if ([weakself.statusStr isEqualToString:@"0"]) {
[weakself getyuyueData];
}else{
[weakself getData:weakself.statusStr];
}
}];
这是目前比较常见的几种,如果有其他情况需要仔细研究了。
如果有错误或者还有其他问题,可以联系我:zhangjieiossky@163.com,谢谢
网友评论