了解Xcode 4.2中Automatic Reference Counting(ARC)

移动开发 iOS
本文介绍的是来了解Xcode 4.2中Automatic Reference Counting特性和使用方法,详细的介绍了ARC的特性,来看详细内容。

了解Xcode 4.2中Automatic Reference Counting (ARC)是本文要讲解的内容,Automatic Reference Counting (ARC),自动引用计数,是开发Cocoa程序时的一个编译级别的特性,用于自动内存管理。

XCode 4.2中,使用模板新建一个工程,该工程将使用ARC特性。

如果你的iOS SDK是iOS5 seed release 2,需要做如下修改,才能避免编译时的错误:

  1. System/Library/Frameworks/CoreFoundation.framework /Headers/CFBase.h   
  2. ,将:   
  3. CFTypeRef CFMakeCollectable(CFTypeRef cf) CF_AUTOMATED_REFCOUNT_UNAVAILABLE;  

修改成:

  1. CFTypeRef CFMakeCollectable(CFTypeRef cf);   
  2.  
  3. 在System/Library/Frameworks/Foundation.framework/Hea ders/NSObject.h中,将: 
  4.  
  5. return (__bridge_retain CFTypeRef)X;  

修改成:

  1.   return (__bridge_retained CFTypeRef)X;  

使用ARC将让你远离烦人且容易遗漏的retain,release和autorelease等操作。

ARC的工作原理是,在你编译程序时,将内存操作的代码(retain,release或autorelease)自动添加到需要的位置。即底层上使用和Manual Reference Counting(手工引用计数)一样的内存管理机制,但由于XCode自动帮你在编译时添加内存操作的代码,从而简化了编程的工作。

启用ARC,编译选项中需加上-fobjc-arc,不过这个由XCode在创建工程模板时帮你完成。

XCode 4.2以前版本都不支持ARC。

对操作系统也有要求:Mac OS X v10.6或v10.7 (64-bit applications),iOS4或iOS5。注意:其中Mac OS X v10.6和iOS4不支持weak references(弱引用,后面会说明什么是weak references)。

Xcode 4.2提供了一个名为“Convert to Objective-C Automatic Reference Counting”的工具,在Edit->Convert menu下,可以帮你自动将使用Manual Reference Counting的老代码转换成使用ARC的新代码(例如去掉对retain和release的调用)。

一个使用ARC的代码例子:

  1.   @interface Person : NSObject   
  2.   @property (nonatomic, strong) NSString *firstName;   
  3.   @property (nonatomic, strong) NSString *lastName;   
  4.   @property (nonatomic, strong) NSNumber *yearOfBirth;   
  5.   @property (nonatomic, strong) Person *spouse;   
  6.   @end   
  7.   @implementation Person   
  8.   @synthesize firstName, lastName, yearOfBirth, spouse; @end  

注意:不再需要重载dealloc函数,因为没有release操作。(strong的语义后面会介绍。)

例子2:

  1. (void)contrived { Person *aPerson = [[Person alloc] init];   
  2. [aPerson setFirstName:@"William"];   
  3. [aPerson setLastName:@"Dudney"];  
  4.  [aPerson:setYearOfBirth:[[NSNumber alloc] initWithInteger:2011]];  
  5.  NSLog(@"aPerson: %@", aPerson);   
  6. }  

注意:没有了release操作。

例子3: (void)takeLastNameFrom:(Person *)person { NSString *oldLastname = [self lastName]; [self setLastName:[person lastName]]; NSLog(@"Lastname changed from %@ to %@", oldLastname, [self lastName]); } 注意:ARC会保证oldLastname引用的对象在NSLog执行结束之前,不会被释放掉。
使用ARC的一些规则: 不能直接调用dealloc方法,不能重载或直接调用retain,release,retainCount,或autorelease等方法。

但可以通过@selector(retain),@selector(release)这样的形式调用。

用户自定义的dealloc方法,不能调用[super dealloc],编译器会自动帮你添加这个代码。

对Core Foundation-style的对象,仍可以使用CFRetain, CFRelease等方法。 不能使用NSAllocateObject或NSDeallocateObject去创建对象,请使用alloc方法。 在c语言中的结构体中,不能再使用对象指针。请放弃C结构体,使用Objective-C的类。 id和void*之间没有隐式的类型转换,请使用显式类型转换。 不能使用NSAutoreleasePool,ARC提供了@autoreleasepool语句块。

例如:

  1. @autoreleasepool {   
  2. // Code, such as a loop that creates a large number of temporary objects.   
  3. }  

不能使用NSZone。 方法和变量的命名不能以“new”开头。 关于对象的生命周期: weak引用:设置成weak的属性,不会影响对象的生命周期,如果引用的对象已经被释放,引用会指向nil。 strong引用:设置成strong的属性,会影响对象的生命周期。 例如:

  1.   @property(strong) MyClass *myObject; 和@property(retain) MyClass *myObject;是等效的。  

又例如:

  1.   @property(weak) MyClass *myObject;和@property(assign) MyClass *myObject; 

在多数情况下等效,但当instance被释放时,设置为weak的引用会指向nil。

可用的限定词: __strong, 默认的 __weak __unsafe_unretained,和weak的区别是当对象被释放时,引用不指向nil。 __autoreleasing,当方法的参数是id*,且希望方法返回时对象被autoreleased,可以添加__autoreleasing限定词。 使用__weak时要特别小心,例如

  1. NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];   
  2. NSLog(@"string: %@", string); //此时string为空,因为weak类型不影响对象的生命周期,对象刚创建就释放了。  

其他特性: 使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。

例如:

  1.   - (void)myMethod { NSString *name; NSLog(@"name: %@", name); //会输出null   
  2.   }  

欢迎大家补充和找bug。

小结:了解Xcode 4.2中Automatic Reference Counting (ARC)的内容介绍完了,希望通过本文的学习,能对你有所帮助!

原文地址:http://blog.sina.com.cn/s/blog_4c4c79950100t3uy.html

责任编辑:zhaolei 来源: 陈成的博客
相关推荐

2013-04-15 10:48:16

Xcode ARC详解iOS ARC使用

2011-07-29 13:40:00

Xcode iOS 4.2 iPhone

2013-02-25 13:00:14

iOS开发xcode

2011-08-04 17:19:49

iPhone开发 Xcode 文档

2011-10-31 14:44:49

2011-03-18 08:39:28

iOS 4.2 SDKiOS SDK

2011-08-01 16:39:21

Xcode 目录结构

2011-07-20 10:59:46

2011-07-29 16:48:04

iPhone SDK Xcode

2011-08-09 15:44:11

XCode 4Plist文件

2010-05-26 18:05:13

2011-07-25 15:54:08

XCode PHP

2023-10-05 06:02:52

计数排序Counting

2011-07-07 09:20:30

Xcode

2014-12-10 10:10:00

蓝牙4.2

2012-07-09 10:22:28

Mono for An

2013-04-15 10:59:08

iOS开发ARC版本说明

2014-12-12 10:25:21

Xcode 6iOS快速上手

2011-07-19 17:05:22

Xcode Libary

2011-07-19 17:49:10

Xcode Xcode4 Frameworks
点赞
收藏

51CTO技术栈公众号