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对象存储在堆,需要手动释放。