现在的位置: 首页 > 综合 > 正文

Xcode 4.2 中的Automatic Reference Counting (ARC)

2013年09月30日 ⁄ 综合 ⁄ 共 1803字 ⁄ 字号 评论关闭

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将让你远离烦人且容易遗漏的retainreleaseautorelease等操作。

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

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

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

对操作系统也有要求:Mac
OS X v10.6
  v10.7
(64-bit applications)
 iOS4iOS5。注意:其中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的新代码(例如去掉对retainrelease的调用)。

一个使用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

抱歉!评论已关闭.