MRC过渡到ARC

来源:互联网 发布:中国网络墙谁设计的 编辑:程序博客网 时间:2024/05/17 09:08

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);

尽管是初始化在heap上,但是没有__strong引用,在创建后就被释放,sting指针成nil。

__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.


    // ...

19、不支持NSAutoreleasePool,建议@autoreleasepool{};

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打钩,再次尝试。


0 0