ARC是咩?
ARC是iOS 5推出的新功能全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,本来需要手动添加的用来处理内存管理的援用计数的代码可以自动地由编译器完成了。
该性能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可使用该性能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的援用计数管理部份代码。有1点,ARC其实不是GC,它只是1种代码静态分析(Static Analyzer)工具。
旧内存管理规则:
1.(谁开发,谁治理),如果使用“alloc”或“new”开头或名字中包括“copy”的方法(例如alloc,newObject或mutableCopy)创建了1个对象,就需要使用释放release或自动释放autorelease来释放。
而使用ARC后,我们可以不需要这样做了,乃至连最基础的release都不需要了:
但是,爽就是要付出代价的,1堆ARC规则袭来:
1.retain, release, autorelease, dealloc由编译器自动插入,不能在代码中使用
2.dealloc虽然可以被重载,但是不能调用[super dealloc],也不能被调用
3.必须遵照内存管理的命名规则;
4.不能使用NSAllocateObject/NSDeallocateObject;
5.使用@autoreleasepool块替换NSAutoreleasePool;
6.不能使用区域(NSZone);
7.对象型变量不能作为C语言结构体(struct/union)的成员;
8.显示转换"id"和"void * ";
当MRR遇到到ARC,表着急
1.arc的设置是在build phases中修改compiler Flags的值。(1,直接在targets->build phases中修改compiler Flags,是不是支持arc。添加:-fobjc-arc,就能够让旧项目支持arc。如果想让原来支持arc的不使用arc则添加-fno-objc-arc)
2,如果使用了arc,在@property声明中,用strong和weak代替相应的retain, copy,和assign。(不过此处有个疑问,在使用了MRR后呢,原来的weak,strong,是不是还需要替换呢?)
3,如果使用了arc,NSAutoReleasePool也不能使用,测试发现,用@autoreleasepool 代替,不会编译报错。