前言
iOS开发中,内存管理是从来都不能忽视的问题,OC采用的是动态内存管理方式,跟踪每个对象被引用的次数,当对象引用次数为0时,则释放对象占用的内存。引用计数分为自动和手动计数(retain 引用、release释放,autorelease 废弃),在此我主要对自动引用计数做相关的分享。
自动引用计数
自动引用计数顾名思义是自动计数管理,是编译器在编译过程中自动添加retain、release来确保对象被释放(注:arc 只能管理oc的对象,不能管理通过malloc申请的内存)并利用@autoreleasepool代替NSAutoreleasePool。
首先让我们先了解下内存管理的思维方式:
自己生成的对象,自己持有
非自己生成的对象,自己持有
不再需要自己持有的对象时释放
非自己持有的对象不能释放
了解了思维方式,那么怎么去生成并持有对象呢,在OC中有多种方法族大家并不陌生,用于初始化并持有对象,分别是alloc/new/copy/mutableCopy。另 init 方法族:以init 开头的方法必须被定义为实例方法,它一定要返回id 类型或父类、子类的指针;其他族可以是类方法也可以是实例方法。另 所有权声明 是通过 _ _strong(强引用,ARC中默认)、_ _weak(弱引用,常用于防止循环引用)、_ _unsafe_unretained(iOS 5下相当于weak)、_ _autoreleasing (自动释放池所用,id/对象 另加 星 * 类型变量 默认)。
引用计数表,在OC 中采用hash表来管理引用计数表键值为内存块地址;这样对象内存块就无需考虑头部了,直接通过引用计数表的内存块地址就可以找到对象内存块。
ARC规则
在ARC中有一些规则必须遵守否则会警告甚至引起程序崩溃
1、不能使用retain/release/retainCount/autorelease
arc 中内存由编译器控制,不必使用上述内存管理方法
2、不能使用NSAllocateObject/NSDeallocateObject
3、必须遵守内存管理方法命名规则 alloc/new/copy/mutableCopy/init
4、不可显示调用dealloc,不能使用NSZone
5、使用@autoreleasepool块代替NSAutoreleasePool
6、对象型变量不能作为C语言结构体的成员
7、显示转换id 和void 如 id obj =[NSObject alloc] init]; void *p =(_ _bridge void *)obj
属性
1、property 指一个对象的属性或特性
2、@synthesize :自动生成getter、setter方法;@dynamic 告诉编译器要自己手动实现 getter、setter
3、给属性指定选项
注:默认为 atomic ,必须要用lock unlock 保证属性的线程安全,如果不是频繁的使用且不考虑多线程的话,尽量用noatomic
一些记录点:
1、arc 的实现 是通过clang 编译器 和objc 运行时库结合进行内存管理
2、引用计数获取方法: _objec_rootRetainCount(id obj)
3、strong 与 retain 在 block 下,strong相当于copy ,retain 相当于 assign
4、在block 里使用外部变量或对象的时候,用__blcok 修饰时实质是指针拷贝
5、GC 垃圾回收机制 只支持 mac os
参考:
1、Apple Open Source : http://opensource.apple.com
2、Apple library : http://developer.apple.com/library/ios