iOS 开发优化点

iOS 内存泄露的情况总结

2020-09-23  本文已影响0人  Sweet丶

内存泄漏:不再使用的内存未回收,一次二次危害可以忽略,但若一直泄漏,内存迟早会用光,最终导致内存溢出,程序crash。
内存溢出:在程序申请内存时,没有足够的内存空间了,会导致程序crash。

iOS 中使用引用计数器来管理对象内存,在ARC下,我们仍然要注意避免内存泄露,下面是本人在项目中遇到的会导致未释放的情况:

一、NSTimer/CADisplaylink

系统的这连个对象在使用时,对target是强引用,如果我们的target直接或间接持有了timer则会导致强引用。

解决办法:

  1. 不用时手动调用invalidate方法。
  2. 不想考虑我什么时候调用invalidate方法,--》target参数传一个代理对象。解决NSTimer的强引用问题.
二、delegate用了strong或retain
  1. 自己使用时候需要注意不用对代理修饰strong或retain。
  2. 系统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化了的对象。

iOS WKWebview与JS交互的两种方式对比
OC中block底层原理总结(上)

上一篇下一篇

猜你喜欢

热点阅读