关于NSNotificationCenter的创建和销毁

学而时习之,不亦乐乎,大家好,我是张杰。

关于通知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)iddelegate;

第三种:使用到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];
    }
}];

这是目前比较常见的几种,如果有其他情况需要仔细研究了。

如果有错误或者还有其他问题,可以联系我:[email protected],谢谢

你可能感兴趣的:(关于NSNotificationCenter的创建和销毁)