内存管理

自动引用计数(ARC)原则:ARC 的规则非常简单:只要还有一个强指针变量指向对象,对象就会保持在内存中,否则就被销毁。

所有权修饰符:
  • __strong
  • __weak
  • __unsafe_unretaied
  • __autoreleasing
所有权修饰符和属性的修饰符对应关系如下所示:
- assign 对应的所有权类型是 __unsafe_unretained
- copy 对应的所有权类型是 __strong
- retain 对应的所有权类型是 __strong
- strong 对应的所有权类型是 __strong
- unsafe_unretained对应的所有权类型是__unsafe_unretained
- weak 对应的所有权类型是 __weak

strong 表示强引用,引用计数+1,strong是id类型和对象类型默认的修饰符。
weak 表示弱引用,弱引用不会影响对象的释放,而当对象被释放时,所有指向它的弱引用都会自定被置为 nil,这样可以防止野指针。weak是通过一个weak表来管理对象的,将对象的内存地址作为key,weak修饰的变量的地址为为value注册到weak表中,当指向的对象被销毁时,会通过其内存地址,去weak表中查找对应的weak修饰符变量,将其从weak表中删除。weak在修饰只是让weak表增加了记录没有引起引用计数表的变化。
unsafe_unretainediOS5引入的,是为了解决引用循环的问题。unsafe_unretained修饰的指针只是纯粹指向对象,没有任何操作,引用计数也不会+1。对象销毁的时候,依然指向原来的地址,不会被自动置为 nil,所以成为了野指针,非常不安全。
autoreleasing将对象赋值给附有autoreleasing修饰符的变量等同于MRC时调用对象的autorelease方法。

循环引用

循环引用就是在两个对象互相之间强引用了,引用计数都加1了,只有当引用计数减为0时对象才释放。但是这两个的引用计数都依赖于对方,所以也就导致了永远无法释放。最容易产生循环引用的两种情况就是Delegate和Block。所以我们就引入了弱引用这种概念,即弱引用虽然持有对象,但是并不增加引用计数,这样就避免了循环引用的产生。也就是我们上面所说的所有权修饰符__weak的作用。关于原理在__weak部分也有描述,简单的描述就是每一个拥有弱引用的对象都有一张表来保存弱引用的指针地址,但是这个弱引用并不会使对象引用计数加1,所以当这个对象的引用计数变为0时,系统就通过这张表,找到所有的弱引用指针把它们都置成nil。

学习链接:https://www.jianshu.com/p/c3344193ce02(齐滇大圣)

你可能感兴趣的:(内存管理)