开发者社区> 问答> 正文

5、ARC下哪些情况会造成内存泄漏?

5、ARC下哪些情况会造成内存泄漏?

展开
收起
游客bnlxddh3fwntw 2020-04-13 15:32:00 869 0
2 条回答
写回答
取消 提交回答
  • 有点尴尬唉 你要寻找的东西已经被吃掉啦!
    delegate设为strong造成的内存泄露(两个对象相互强引用)
    
    NSTimer 造成的内存泄露(两个对象相互强引用)
    self 持有 timer,timer 在初始化时持有 self,造成循环引用
    

    // * interface@interface SomeViewController : UIViewController @property (nonatomic, strong) NSTimer timer; @end // implementation@implementation SomeViewController - (void)someMethod { timer = [NSTimer scheduledTimerWithTimeInterval:0.1 target:self
    selector:@selector(handleTimer:)
    userInfo:nil
    repeats:YES];
    } @end

    解决的方法就是使用 invalidate 方法销毁掉 timer

    死循环造成的内存泄露
    

    CATransition *transition = [CATransition animation]; transition.duration = 0.5; tansition.repeatCount = HUGE_VALL; [self.view.layer addAnimation:transition forKey:"myAnimation"];

    上例中,animation重复次数设成HUGE_VALL,一个很大的数值,基本上等于无限循环了。 解决办法是,在ViewController关掉的时候,停止这个animation。 -(void)viewWillDisappear:(BOOL)animated { [self.view.layer removeAllAnimations]; }

    非oc方法开辟的堆内存造成的泄露
    使用malloc new 等非oc方法开辟的堆内存,需要使用对应的回收方法回收内存,arc不会自动回收这些内存。
    
    2020-04-13 18:57:08
    赞同 展开评论 打赏
  • block中的循环引用

    NSTimer的循环引用

    addObserver的循环引用

    delegate的强引用

    大次数循环内存爆涨

    非OC对象的内存处理(需手动释放)

    2020-04-13 15:32:18
    赞同 展开评论 打赏
问答地址:
问答排行榜
最热
最新

相关电子书

更多
低代码开发师(初级)实战教程 立即下载
冬季实战营第三期:MySQL数据库进阶实战 立即下载
阿里巴巴DevOps 最佳实践手册 立即下载