iOS 内存管理

内存管理方式:

  1.ARC(自动内存计数)  编译器会自动在程序合适位置插入retain和release代码,用来管理对象的持有和

释放,实现自动引用计数。

  ARC提供了四种修饰符来修饰对象:

    1. Strong  表示强引用,当对象没有一个强引用时才会被释放。对象默认是强引用。

    2.weak 弱引用  不会影响对象的引用计数,当对象释放时,指向该对象的所以弱引用都会被置空。

    3. autorelrasing

    4.unsafe_unretained

  

weak原理:

  runtime维护了一张weak表(hash表),对象被弱引用后,对象的内存地址为key存储在weak表中,value是指向

该对象的所有弱引用的指针。

实现步骤:

  1.初始化时,runtime会调用objc_initWeak函数,生成一个weak指针指向对象的地址。

  2.添加引用时,在objc_initWeak中会调用objc_storeWeak函数,该函数跟新指针指向,创建对应的弱引用表。

  3.释放时,调用clearDeallocating函数,根据对象地址获取所有weak指针地址的数组,然后遍历这个数组把其中

的数据设置为nil。

引用计数原理:

  内存管理就是用引用计数来管理的,当引用计数为零时,系统会收回该段内存。iOS里的引用计数是怎样实现的呢???

因为每个对象都会有一个引用计数,所以每个对象都应该存储自己的引用计数,在看了《Objective-C高级编程:iOS与OS X多线程和内存管理》

书之后,发现苹果是用runtime统一管理所有对象的引用计数

不用考虑引用计数所站的内存

自动释放池:

   自动释放池是以栈的形式实现的,当你创建一个新的自动释放池时,会被添加到栈顶。

   向对象发送autorelease消息时,系统会将对象的引用放入到最新的自动释放池,但是对象还是正当的,在

自动释放池定义的作用域内其他对象可以向它发送消息,程序执行到作用域结束位置,自动释放池释放,也会向

自动释放池中的对象发送release消息。

程序把局部变量存储在栈中,当其作用域执行完毕后,就会被系统立即收回。

OC对象存储在堆,需要手动释放。

原文地址:https://www.cnblogs.com/lcl15/p/9645751.html