我们在开发的时候都知道有arc和mrc
那么我们现看arc是什么:arc的全称是automatic reference counting (arc) 是一个编译期的技术,利用此技术可以简化objective-c编程在内存管理方面的工作量。
arc在xcode4.2中引入,在mac os x v10.6,v10.7 (64位应用),ios 4,ios 5中支持,xcode4.1中不支持这个技术。
我们使用的arc 其实是oc编译器的特性,而不是运行时特性或者垃圾回收机制,ARC做的是在代码编译是为你自动在合适的位置插入release或者autorelease,只要没有强指针指向对象,对象就会被释放掉。它分为两部分,一个是前段编译器,用来插入release或者retain。另一个是优化器,因为代码中可能会出现release的重复调用等等一些多余的情况,这时候优化器就会自动负责移除这些多余的指令,保证生成的代码的运行质量。
这里插入一个对于NSZone的理解和简单介绍:arc模式中不可以调用nszone的方法。NSZone可以简单想象为一个内存池,alloc或是dealloc这些操作,都是在这个内存池中操作的。默认的NSZone的缺陷在于,它是全局范围的,时间一长,导致内存的碎片化,那么性能就会受到一些影响。我们一般用到这个类一般都是在字符串定义之后 有copyWithZone的方法调用。
ARC中有很多限制和规定:
1.不能使用retain/release/retainCount/autorelease
使用ARC,内存管理由编译器来负责,无需写上面关键词
不能再使用nsautoreleasepool对象,arc提供了@autoreleasepool块来代替它,这样更加有效率。
2.在ARC环境下,使用alloc/new/copy/mutableCopy来生成/持有对象
copy/mutableCopy的使用需要copyWithZone的支持,如果没有,则不支持copy/mutableCopy
3.不能显示调用[super dealloc]
4.使用@autoreleasepool块来替代NSAutorealeasePool
5.不能使用内存存储区(不能再使用nszone)
6.对象变量不能作为C语言结构体的成员
7.显示转换id和void *
在不使用ARC时,下面的转化是正确的
id obj=[[NSObject alloc] init];
void *p=obj;
如果使用ARC,上述转换就会报错,加__bridge转换
id obj=[[NSObject alloc] init];
void *p=(__bridge void*)obj;
8.声明outlet时一般应当使用weak,除了对storyboard 这样nib中间的顶层对象要用strong
9.weak 相当于老版本的assign,strong相当于retain