美文网首页
常见的内存泄漏

常见的内存泄漏

作者: 迷失的信徒 | 来源:发表于2021-05-15 19:29 被阅读0次

内存泄漏的常见情况

1、对象之间的循环引用,循环引用的实质是:多个对象之间相互有强引用,不能释放让系统回收,解决办法:使用weak打破对象的相互应用。
2、Block的循环引用,blockcopy的时候都会对block内部的对象进行强引用,解决办法:使用_weak打破循环,此方法只能在ARC有效;在MRC下应该使用一下

_blcok _weak typeof(self) weakSelf = self;self.myBlock = ^(){}

3、delegate的循环引用,delegate是委托模式(将一件属于委托者的事情,交给另外一个被委托者来处理),这里可能会出现委托者和被委托者之间的相互强引用;解决办法:在声明delegate属性的时候用weak进行弱引用或者通过中间对象(代理对象)的方式来解决。(效率更高的中间对象NSProxy,不需要进行发送消息和再动态解析,直接进行消息转发)
4、CADisplayLinkNSTimer会对target产生强引用,如果target又对他们产生强引用,那么就会产生循环引用;解决办法:NSTimer有一个block的方法,我们可以利用block的弱指针来解决

_weak typeof(self) weafSelf = self;传weakSelf进去。

5、通知的循环引用,iOS9以后一般的通知都不需要手动进行移除观察者,系统会自动在dealloc的时候调用[[NSNotificationCenter defaultCenter] removeObserver: self]。iOS9以前的需要手动的进行移除。原因:iOS9以前的观察者注册时,通知中心并不会对观察者对象做retain操作,而是进行了unsafe_unretained引用,所以在观察者被回收的时候,如果不对通知进行手动移除,那么指针指向被回收的内存区域就会成为野指针,这时再发送通知,便会造成程序崩溃。从iOS9开始通知中心会对观察者进行weak弱引用,这时即使不对通知进行手动移除,指针也会在观察者被回收的时候自动置空,这时再发送通知,向空指针发送消息是不会有问题的。但是建议最好还是加上移除通知的操作

(void)dealloc { [[NSNotificationCenter defaultCenter] removeObserver:self.observer name:@"name" object:nil]; }

6、WKWebView造成的内存泄漏;总的来说WKWebView不管是性能还是功能,都要比UIWebView强大的很多,本身也不存在什么内存泄漏的问题,但是如果开发者使用不当的话还是会造成内存泄漏的,addScriptMessageHandler这个操作导致了WKWebView对self进行了强引用,然后addSubview这个操作,也让self对WKWebView进行了强引用,这就造成了循环引用;解决方法就是在合适的机会里对MessageHandler进行移除操作

(void)viewDidDisappear:(BOOL)animated { [super viewDidDisappear:animated]; [_wkWebView.configuration.userContentController removeScriptMessageHandlerForName:@"WKWebViewHandler"]; 

内存泄漏的查询

1、Analyze静态分析(command + shift + b)也就是编译,主要分析以下四种问题:

①、逻辑错误:访问空指针或未初始化的变量等;
②、内存管理错误:如内存泄漏等;
③、声明错误:从未使用过的变量;
④、Api调用错误:未包含使用的库和框架;

2、Instruments中的Leak动态分析内存泄漏,product->profile ->leaks 打开工具主窗口

3、Facebook早已开源了一款检测内存问题的三方库FBRetainCycleDetector

相关文章

  • Xcode调试工具

    一.静态内存分析工具 编译阶段查找内存泄漏等问题 1.常见内存泄漏问题 常见的内存泄漏除了循环引用,CoreFou...

  • 记录电商公司面试

    面试记录 问了常见的内存泄漏常见有哪些 Handler的内存泄漏情况 activity,window,view之间...

  • Android性能优化 内存泄漏和内存溢出

    内存泄漏 内存溢出 常见的内存泄露场景 常见的内存溢出场景

  • Android 内存泄漏

    内存泄漏的原因 常见的内存泄漏与解决方法 检测内存泄漏 认识内存泄漏 根本原因就是当一个对象理应被回收的时候,因为...

  • Android常见内存泄漏汇总

    目录:一、内存泄漏介绍二、常见内存泄漏场景1.单例导致内存泄露2.静态变量导致内存泄漏3.非静态内部类导致内存泄露...

  • LeakCanary和常见内存泄漏场景

    LeakCanary和常见内存泄漏场景 一. LeakCanary介绍 1. 介绍 2. 用法 二. 常见泄漏方式...

  • Android内存泄漏检测和定位

    建议阅读Android常见内存泄漏这篇文章,本文的例子来源于文章中的内存泄漏典型例子 内存泄漏检测工具 Profi...

  • Android内存泄漏相关

    问题1 内存泄漏的基本定义是什么?内存泄漏有什么危害?问题2 开发中常见的内存泄漏的情况有哪些?什么原因造成的?怎...

  • AliOS Things 维测典型案例分析 —— 内存泄漏

    维测典型案例分析1 —— 内存泄漏 在系统运行的过程中,内存泄漏是较为常见但是很难复现的现象,一般的内存泄漏点都是...

  • Android内存泄漏原因及解决的总结

    分三步说明Android内存泄漏的原因及解决,“内存泄漏与内存溢出的区别”,“引用方式”,“常见引发原因与解决方案...

网友评论

      本文标题:常见的内存泄漏

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