美文网首页
UIViewController 不走-(void)deallo

UIViewController 不走-(void)deallo

作者: 小熊_07cb | 来源:发表于2019-04-12 10:04 被阅读0次

OS中控制器的释放问题

ARC工程是可以重写dealloc方法并被系统调用的,但不需要手动调用父类的dealloc,手写[super dealloc]方法会报错,事实上系统会自动帮你调用父类的dealloc方法,不需要你实现。可以通过在dealloc方法中打印log查看控制器是否被释放。

控制器在被pop后移出栈后会被释放,但有些时候会发现控制器出栈的时候不会调用dealloc方法,归根结底,是因为当前控制器被某个对象强引用了,控制器的引用计数不为0,系统无法帮你释放这部分内存。

解决释放不掉原因如下

一.block块使用不当。因为block会对方法中的变量自动retain一次。请检查控制器中block代码。(我的就是因为这没有走dealloc)即:保险起见block中所有的涉及到self的全给替换成weakSelf

二.NSTimer没有销毁。在viewWillDisappear之前需要把控制器用到的NSTimer销毁。当控制器中存在NSTimer时,就需要注意,因为当[NSTimer scheduledTimerWithTimeInterval:1.0 target:self selector:@selector(updateTime:) userInfo:nil repeats:YES];时,这个/target:self/ 就增加了VC的RetarnCountr, 如果你不将这个timer invalidate,就别想调用dealloc。需要在viewWillDisappear之前需要把控制器用到的NSTimer销毁。

[timer invalidate]; // 销毁timer

timer = nil; // 置nil

三.控制器中的代理属性一定要是弱引用,不要强引用。@property (nonatomic, weak) id<HCAppViewDelegate> delegate;

以上都是网上说法

以下是我在本项目中测试出来的

1.成员变量  

A. 在mjrefresh block 中释放不掉

B.在- (void) handleControlEvent:(UIControlEvents)controlEvent withBlock:(ActionBlock)action; 释放不掉

注意 但是在网络请求里面可以释放掉    

2.懒加载

A.在懒加载里面如果有block  在block 里面不能这样写 _m_labName   的weakSelf.m_labName用弱应用

B. 用懒加载得到view的VC   在block 用释放不掉  即使不 在block中也释放不掉  

[DToolsgetViewController:self]; 对应的代码

如果在block 中单写[DToolsgetViewController:weakSelf];   也可以释放掉

-(void)dealloc

{

}

方法没写 

相关文章

网友评论

      本文标题:UIViewController 不走-(void)deallo

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