ios的内存管理技术是自动引用计数也就是(Automatic Reference Counting,自动引用计数,简称ARC
)。在object_c内存管理中每个对象都有自己的引用计数器,创建一个对象,应用计数+1,如果想让对象继续存活,就递增它的应用计数,如果不再使用它,就递减它的应用计数。如果对象不再被使用之后,引用计数就记为0,系统就会销毁这个对象。
引用计数有着及时的回收垃圾,相对于其它的内存管理GC技术查找次数少的优点,让我们感觉到了ios的流畅性。不过这种技术是怎么出现的呢?为什么要这样设计。
这就要回到以前开发者们那段阴影回忆,ios的手动管理引用计数的也就是MRC(manual retain-release),MRC
。当时开发情形自形脑补,哈哈~
程序员手动添加retain来使引用计数+1,release 使引用计数-1.但一般遵循下面几个原则。
- 开头为alloc,new,copy,mutableCopy的方法创建的对象,引用计数都会被+1;
- 如果需要对对象进行引用,可以通过retain来使引用计数+1;
- 不再使用该对象时候,通过release使应用计数-1;
- 不要release你没有持有的对象。
在ARC时代,我们就不需要手动Retain,Release了。ARC是MRC的升级版,让NSObject类本身肩负了内存管理的职责,alloc是NSObject类的类方法,retain、release、dealloc是NSObject类的实例方法。以及引用了一些修饰符strong,weak,__strong,__weak,__unsafe_reatian等等。如使用weak,__weak关键字可以有效的避免野指针的问题。
weak
weak是ARC中新增加的属性修饰符,主要定义一种“非拥有关系”,使用weak修饰的属性的setter方法会既不保留新值,也不释放旧值,不会使属性指的对象的引用计数增加,当指向的对象被释放时,属性值也会被自动置为nil。
strong
strong是ARC中新增加的属性修饰符,跟MRC时代中的retain修饰符很像,描述一种“拥有关系”,使用strong修饰的属性的setter方法会先保留新值,再释放旧值,最后把新值设置上。
unsafe_unretained
unsafe_unretained与assign类似,但是用于对象类型,从字面意思上,也能看到,它是不安全,也不会强引用对象,所以它跟weak很相似,跟weak的区别在于当指向的对象被释放时,属性不会被置为nil,所以是不安全的。
但在ARC下也有些规则是我们要考虑的如:
- 不能使用retain/release/retainCount/autorelease。
- 不能使用NSAllocateObject/NSDeallocateObject。
- 必须遵守内存管理的命名规则。
- 不能显示的调用dealloc,比如[super dealloc]。
- 用@autorelease代替NSAutoreleasePool。
- 不能使用NSZone。
- 对象类型变量不能作为C语言结构体成员(可以用__unsafe_unretain修饰之后使用)
- 不能显示转换id和void*(可以通过_bridge,_bridge_retained,__bridge_transfer)。
objc对象ARC自动帮我们管理了,但非objc对象还是要自己管理。从ARC来管理内存的角度看,无非是这一系列操作生成并持有(alloc/new/copy/mutableCopy)、持有(retain)、释放(release)、废弃(dealloc)
先记录到这……
后面会从runtime源码来看retain ,release,dealloc
网友评论