iOS 内存泄露的情况总结
2020-09-23 本文已影响0人
Sweet丶
内存泄漏:不再使用的内存未回收,一次二次危害可以忽略,但若一直泄漏,内存迟早会用光,最终导致内存溢出,程序crash。
内存溢出:在程序申请内存时,没有足够的内存空间了,会导致程序crash。
iOS 中使用引用计数器来管理对象内存,在ARC下,我们仍然要注意避免内存泄露,下面是本人在项目中遇到的会导致未释放的情况:
一、NSTimer/CADisplaylink
系统的这连个对象在使用时,对target是强引用,如果我们的target直接或间接持有了timer则会导致强引用。
解决办法:
- 不用时手动调用invalidate方法。
- 不想考虑我什么时候调用invalidate方法,--》target参数传一个代理对象。解决NSTimer的强引用问题.
二、delegate用了strong或retain
- 自己使用时候需要注意不用对代理修饰strong或retain。
- 系统
NSURLSession
对它的代理是强引用. 所以我们在使用时,应该手动打破这个循环引用。(如果使用单例,则导致只能基于一个会话NSURLSession
对象处理,在需要多个会话时变得很僵)
@property (nullable, readonly, retain) id <NSURLSessionDelegate> delegate;
三、KVO观察者、NSNotification的观察者
1、KVO观察者需要手动移除(iOS12及以后不用移除)。
2、NSNotification的观察者在iOS10以下需要手动移除。
四、WKWebview使用时,使用userContentController注册了网页交互方法名
1、使用原生方式处理webveiw与JS交互时,需要使用userContentController注册了网页交互方法名。
[userCC addScriptMessageHandler:self name:JSMessageName_Register];
在控制器销毁时需要手动移除
- (void)dealloc
{
WKUserContentController *userCC = self.webView.configuration.userContentController;
[userCC removeScriptMessageHandlerForName:JSMessageName_Register];
}
五、Block中循环引用
如果形成了循环引用,则需要在block中引用weak化了的对象。