美文网首页
关于NSNotificationCenter的创建和销毁

关于NSNotificationCenter的创建和销毁

作者: 杰小冷_4957 | 来源:发表于2020-10-29 12:00 被阅读0次

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

    关于通知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,谢谢

    相关文章

      网友评论

          本文标题:关于NSNotificationCenter的创建和销毁

          本文链接:https://www.haomeiwen.com/subject/kkekvktx.html