Automatic
Reference Counting (ARC), 自动引用计数,是开发Cocoa程序时的一个编译级别的特性,用于自动内存管理。
在XCode
4.2中,使用模板新建一个工程,该工程将使用ARC特性。
如果你的iOS
SDK是iOS5
seed release 2,需要做如下修改,才能避免编译时的错误:
● 在System/Library/Frameworks/CoreFoundation.framework/Headers/CFBase.h中, 将:
CFTypeRef
CFMakeCollectable(CFTypeRef cf) CF_AUTOMATED_REFCOUNT_UNAVAILABLE;
修改成:
CFTypeRef
CFMakeCollectable(CFTypeRef cf);
●在System/Library/Frameworks/Foundation.framework/Headers/NSObject.h中, 将:
return
(__bridge_retain CFTypeRef)X;
修改成:
return
(__bridge_retained CFTypeRef)X;
使用ARC将让你远离烦人且容易遗漏的retain,release和autorelease等操作。
ARC的工作原理是,在你编译程序时,将内存操作的代码(retain,release或autorelease)自动添加到需要的位置。即底层上使用和Manual
Reference Counting(手工引用计数)一样的内存管理机制,但由于XCode自动帮你在编译时添加内存操作的代码,从而简化了编程的工作。
启用ARC,编译选项中需加上-fobjc-arc,不过这个由XCode在创建工程模板时帮你完成。
4.2以前版本的XCode都不支持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的代码例子:
@interface
Person : NSObject
@property
(nonatomic, strong) NSString *firstName;
@property
(nonatomic, strong) NSString *lastName;
@property
(nonatomic, strong) NSNumber *yearOfBirth;
@property
(nonatomic, strong) Person *spouse;
@end
@implementation
Person
@synthesize
firstName, lastName, yearOfBirth, spouse; @end
注意:不再需要重载dealloc函数,因为没有release操作。(strong的语义后面会介绍。)
例子2:
-
(void)contrived
{Person
*aPerson = [[Person alloc] init];[aPerson
setFirstName:@"William"];[aPerson
setLastName:@"Dudney"];[aPerson:setYearOfBirth:[[NSNumber
alloc] initWithInteger:2011]];NSLog(@"aPerson:
%@", aPerson);
}
注意:没有了release操作。
例子3:
-
(void)takeLastNameFrom:(Person
*)person {NSString
*oldLastname = [self lastName];[self
setLastName:[person lastName]];NSLog(@"Lastname
changed from %@ to %@", oldLastname, [self lastName]);
}
注意:ARC