当前位置:首页 > 内存 > 正文

内存泄漏的几种情况

  • 内存
  • 2024-07-28 07:12:13
  • 6881

一、内存泄漏是编写代码时最不想要遇到的情况之一,为什么?

内存泄漏是您在编写代码时最不想遇到的事情之一。由于内存泄漏本身就会发生,因此如果程序根本不运行,则需要停止正在运行的程序或查找并修复错误。这是一种空间分配给数据但最后没有被回收的现象。当程序退出时,可能由于以下原因而发生错误:

1.由单例静态引起

不回收单例静态是内存泄漏的最常见原因。因为singletonstatic本身的生命周期与此不同。在长时间的使用过程中,单例仍然占据着对象引用开辟的空间,导致程序结束时出现内存泄漏。就好像我借了你的钱,你的一部分钱到了我手里,我答应在一定时间内归还,但如果我忘记了,我就不会还,只能等到资金链断了。还没来得及思考,它终于崩溃了。

2.内部类保存外部类。

外部类创建的任何实例对象最终都会被内部类数据使用。外部类不再使用,但是内部类还在使用,这块内存没有释放,所以外部类没有被回收,这也会造成内存泄漏。

3.库和协议连接

当连接到数据库或网络时,当连接终止时,该数据的使用将继续。连接直到结束才关闭,这样可以防止大量对象被回收,导致内存泄漏和应用程序崩溃和冻结。

4、当变量的定义域不合理时

果在使用变量的过程中使用了变量本身的定义域,如果超出了范围,则该变量的定义域变量必须受到限制。如果输入了所需的范围并且不留空,就会出现内存泄漏。


二、ios开发哪些情况会导致内存泄露如何检查iOS中的内存泄漏,有以下几种方法供大家参考:
1.静态分析
通过静态分析,可以初步了解代码中的一些不规范的地方或者存在内存泄漏的情况。这是检测内存泄漏的第一步。当然,有一些警告不值得关注,可以忽略。
2.通过instruments检查内存泄漏
该方法可以大致定位内存泄漏发生的位置。该方法是完成一个循环操作。如果内存增长为0,则证明程序在循环操作中没有内存泄漏。如果内存增长不为0,则证明可能存在内存泄漏。当然,具体问题需要具体分析。
3.测试内存泄漏的代码
在做这项工作之前,要注意dealloc方法中是否已经释放了该对象拥有的所有对象。观察对象的创建和销毁是否是配对的。准确的说,就是init(创建对象的方法)和dealloc是否会成对触发(简单来说,一旦创建了一个对象,就会有一个dealloc步骤)。
以下是一些比较隐蔽的导致内存泄漏的情况:
1.两个对象互相拥有:也就是说,对象a保留/addSubview对象b,对象b也留/addSubview。addSubView有一个对象。注意:不要将retain属性用于delegate。使用分配属性也将导致共同所有权。
2.有时候需要使用removeFromSuperView来释放:具体来说,可能a对象拥有一个b对象,而b对象被添加到c对象中,而在设计中,b对象的生命周期应该与b对象的生命周期相同一个对象;此时只要一句[brelease]/self.b=nil就无法释放b对象(一般release会retainCount-1,[superdealloc]会再次retainCount-1所有subView,且b不是a的)subView,所有最后一个-1消失了);所以你需要在它之前添加[bremoveFromSuperView]。