OC中的自动引用计数

目录:

1,自动引用计数的定义

2,强引用和弱引用

3,类比手动引用

4,循环引用

5,CoreFoundation

内容:

自动引用计数的定义:

(Automatic Reference Counting) 在编译时自动在合适的位置加入retain 和 release,简化内存管理,自动引用计数不是内存管理,而是通过强引用(__strong)和弱引用(__weak)指针来标记内存的管理方式,当指向对象的强引用指针数等于0时,内存才会释放。

强引用和弱引用:

__strong, 当我创建一个oc类型时,默认的就是strong.

__weak, 当weak类型的指针指向的对象被释放后,指针会自动设置成nil.

注意:assign修饰的属性时,功能类似于weak,但其对象被释放后不会设置成nil. 还有retain相当于strong,但是用于手动计数。

类比手动引用:

在自动引用计数里,我不能手动调用dealloc,retain, release, autorelease 和 retainCount.

循环引用:

自动引用计数不是万能的,当出现循环引用时,内存不会被释放,比如当定义了两个类型A 和 B,A中的某个属性指向B的对象,B中的属性指向A的对象,当我们完成相关逻辑后,把A和B的对象设置成nil,这时你会发现两个对象并没有被释放,这时我应该把其中一个类的属性设置成weak,assign 或 unsafe_unretained.

相关的控制权如下:

  • assign implies __unsafe_unretained ownership.
  • copy implies __strong ownership, as well as the usual behavior of copy semantics on the setter.
  • retain implies __strong ownership.
  • strong implies __strong ownership.
  • unsafe_unretained implies __unsafe_unretained ownership.
  • weak implies __weak ownership.

CoreFoundation:

自动引用计数只能管理oc对象,对CoreFoundation里的对象就无能为力了,但有另外一些规则:

__bridge  - OC 和 CF对象可以相互转换,但不影响引用,就是说控制权没有转移。

__bridge_retained - OC转成CF对象,CF管理内存 (CFRelease)

__bridge_transfer - CF转成OC对象, OC管理内存

上一篇:用Broadcast Receiver刷新数据(二)


下一篇:高强度学习训练第十二天总结:Java hashCode和equals的关系