1、是编译器的组件,不是OC的语言的。从iOS5完美支持。
2、编译器会在编译的时候加入内存管理的相关代码,去保证变量的生命周期,同时遵循手动管理内存的规范,方便了程序员的开发。
3、为了让编译器正确知道变量何时被释放,程序员能够调用的函数受到约束,比如不能够调用release,同时对变量也要学会使用必要的转变(toll-free briging)
3.1、toll - free briging :
3.1.1、Core Foundation framework and the Foundation framework 中的部分数据类型是可以转化的。如:代码片段1.
3.1.2、不是所有的都可以转化,如:NSRunLoop is not toll-free bridged to CFRunLoop。
3.1.3、虽然转化方便,但是程序员要正确的告诉编译器你的转化,如:CFLocaleRef gbCFLocale = (CFLocaleRef) gbNSLocale;,同时注意必要的管理内存,因为编译器不会自动管理Core Foundation objects,所以在转化后你需要告诉编译器对象的所有权,通过a cast (defined inobjc/runtime.h) 或者 a Core Foundation-style macro (defined inNSObject.h),如:代码片段1
3.1.4 __bridge , Foundation <----->Core Foundation,互转,不改变所有权;如:代码片段1
__bridge_retained 或者CFBridgingRetain,Foundation ---->Core Foundation,单向转化,在CoreFoundation Objects对象使用完后要程序员调用CFRelease释放;如:代码片段1
__bridge_transfer or CFBridgingRelease,Core Foundation---->Foundation,单向转化,在Foundation Objects对象使用完后要程序员调用release释放,如果是arc则不用;如:代码片段1
代码片段1
NSLocale *gbNSLocale = [[NSLocale alloc] initWithLocaleIdentifier:@"en_GB"];
|
CFLocaleRef gbCFLocale = (CFLocaleRef) gbNSLocale;
|
CFStringRef cfIdentifier = CFLocaleGetIdentifier (gbCFLocale);
|
NSLog(@"cfIdentifier: %@", (NSString *)cfIdentifier);
|
// logs: "cfIdentifier: en_GB"
|
CFRelease((CFLocaleRef) gbNSLocale);
|
|
CFLocaleRef myCFLocale = CFLocaleCopyCurrent();
|
NSLocale * myNSLocale = (NSLocale *) myCFLocale;
|
[myNSLocale autorelease];
|
NSString *nsIdentifier = [myNSLocale localeIdentifier];
|
CFShow((CFStringRef) [@"nsIdentifier: " stringByAppendingString:nsIdentifier]);
|
// logs identifier for current locale |
|
4、arc引进新的变量修饰符和属性修饰符。
5、编译器自动生成dealloc。
6、Object properties are strong by default
7、你不能调用dealloc,retain,release,retaincount,autorelease.
8、你可以实现dealloc,去把delegate置nil和释放那些不受arc控制的变量,比如CoreFoundation和malloc的变量。但是不能调用[super dealloc]
9、不能用NSAllocateObject or NSDeallocateObject.
10、不能在c的结构里里包含oc对象指针
11、不能随便转化id 和void*,参见toll - free
12、不能用NSAutoreleasePool,用@autoreleasepool blocks代替
13、不能用NSZone
14、不能再属性上声明以new开头的变量,如:@property NSString *newTitle;是不合法的。有一种规避方法,但是不建议,直接忘记就行。
15、arc使用新的生命周期修饰符和若引用功能
16、属性用strong(效果同retain)和weak(效果同assign,区别在于对象释放后自动nil)。strong默认。
17、变量修饰符:__strong(默认),拥有heap上的对象,如:
NSString * __strong string = [[NSString alloc] initWithFormat:@"First Name: YunLong"];
__weak 普通指针,对象释放后自动nil,如:
NSString * __weak string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];
|
NSLog(@"string: %@", string); |
__unsafe_unretained 普通指针,对象释放后不会自动nil,不建议,直接忘了就行。
__autoreleasing 对不起,不理解,期待高手指导。
18、变量和形参修饰符统一,否则影响效率。如:
NSError * __strong e;
|
and the method declaration would typically be:
-(BOOL)performOperationWithError:(NSError * __autoreleasing *)error;
|
The compiler therefore rewrites the code:
NSError * __strong error;
|
NSError * __autoreleasing tmp = error;
|
BOOL OK = [myObject performOperationWithError:&tmp];
|
error = tmp;
|
if (!OK) {
|
// Report the error.
|
// ... |
20、arc下stack变量默认nil
21、混编-fobjc-arc支持arc,-fno-objc-arc关闭arc
22、利用Xcode将mrc转化arc,Edit->Refactor下的Convert to Objective-C ARC,不能转换,需要修复ARC readiness issues..后面还告诉我们要看到所有的所谓的ARC readiness issues,Xcode5可以到设置的Xcode->Preferences->General里把Continue building after errors打钩,再次尝试。