`

iphone ARC

 
阅读更多

ARC是什么 ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地

ARC是什么

ARC是iOS 5推出的新功能,全称叫 ARC(Automatic Reference Counting)。简单地说,就是代码中自动加入了retain/release,原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成了。

该机能在 iOS 5/ Mac OS X 10.7 开始导入,利用 Xcode4.2 可以使用该机能。简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码。有一点,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。

变化点

通过一小段代码,我们看看使用ARC前后的变化点。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
@interface NonARCObject : NSObject {
    NSString *name;
}
-(id)initWithName:(NSString *)name;
@end

@implementation NonARCObject
-(id)initWithName:(NSString *)newName {
    self = [super init];
    if (self) {
        name = [newName retain];
    }
    return self;
}

-(void)dealloc {
    [name release];
    [Super dealloc];
}
@end
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
@interface ARCObject : NSObject {
    NSString *name;
}
-(id)initWithName:(NSString *)name;
@end

@implementation ARCObject
-(id)initWithName:(NSString *)newName {
    self = [super init];
    if (self) {
        name = newName;
    }
    return self;
}
@end
我们之前使用Objective-C中内存管理规则时,往往采用下面的准则

   生成对象时,使用autorelease

   对象代入时,先autorelease后再retain

   对象在函数中返回时,使用return [[object retain] autorelease];

而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。

使用ARC的好处

使用ARC有什么好处呢?

   看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了

   代码的总量变少了,看上去清爽了不少,也节省了劳动力

   代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性

不好的地方

   记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期

   一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关

关于第二点,由于 XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有"Automatic Reference Counting Issue"的错误信息。

 

这个时候,可以将项目编译设置中的“Objectice-C Auto Reference Counteting”设为NO。如下所示。

如果只想对某个.m文件不适应ARC,可以只针对该类文件加上 -fno-objc-arc 编译FLAGS,如下图。

ARC基本规则

    retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用

    dealloc虽然可以被重载,但是不能调用[super dealloc]

由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。

Objective-C对象

ObjectiveC中的对象,有强参照(Strong reference)和弱参照(Weak reference)之分,当需要保持其他对象的时候,需要retain以确保对象引用计数加1。对象的持有者(owner)只要存在,那么该对象的强参照就一直存在。

对象处理的基本规则是

    只要对象的持有者存在(对象被强参照),那么就可以使用该对象

    对象失去了持有者后,即被破弃

强参照 (Strong reference)
 
(s1)

firstName作为”natsu”字符串对象的最初持有者,是该NSString类型对象的Strong reference。

(s2)

这里将firstName代入到aName中,即aName也成为了@”natsu”字符串对象的持有者,对于该对象,aName也是Strong reference。

(s3)

这里,改变firstName的内容。生成新的字符串对象”maki”。这时候firstName成为”maki”的持有者,而@”natsu”的持有者只有aName。每个字符串对象都有各自的持有者,所以它们都在内存中都存在。

(s4)

追加新的变量otherName, 它将成为@”maki”对象的另一个持有者。即NSString类型对象的Strong reference。

(s5)

将otherName代入到aName,这时,aName将成为@”maki”字符串对象的持有者。而对象@”natsu”已经没有持有者了,该对象将被破弃。

弱参照 (Weak reference)

接下来我们来看看弱参照 (Weak reference) 的使用方式。

(w1)

与强参照方式同样,firstName作为字符串对象@”natsu”的持有者存在。即是该NSString类型对象的Strong reference。

(w2)

使用关键字__weak,声明弱参照weakName变量,将firstName代入。这时weakName虽然参照@”natsu”,但仍是Weak reference。即weakName虽然能看到@”natsu”,但不是其持有者。

(w3)

firstName指向了新的对象@”maki”,成为其持有者,而对象@”natsu”因为没有了持有者,即被破弃。同时weakName变量将被自动代入nil。

引用关键字

ARC中关于对象的引用参照,主要有下面几关键字。使用strong, weak, autoreleasing限定的变量会被隐式初始化为nil。

__strong

变量声明缺省都带有__strong关键字,如果变量什么关键字都不写,那么缺省就是强参照。

__weak

上面已经看到了,这是弱参照的关键字。该概念是新特性,从 iOS 5/ Mac OS X 10.7 开始导入。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题,比如下面的代码。

1
2
NSString __weak *string = [[NSString alloc] initWithFormat:@"First Name: %@", [self firstName]];
NSLog(@"string: %@", string); //此时 string为空

如果编译设定OS版本 Deployment Target 设定为这比这低的版本,那么编译时将报错(The current deployment target does not support automated __weak references),这个时候,我们可以使用下面的__unsafe_unretained。

弱参照还有一个特征,即当参数对象失去所有者之后,变量会被自动付上nil (Zeroing)。

__unsafe_unretained

该关键字与__weak一样,也是弱参照,与__weak的区别只是是否执行nil赋值(Zeroing)。但是这样,需要注意变量所指的对象已经被破弃了,地址还还存在,但内存中对象已经没有了。如果还是访问该对象,将引起「BAD_ACCESS」错误。

__autoreleasing

该关键字使对像延迟释放。比如你想传一个未初始化的对像引用到一个方法当中,在此方法中实例化此对像,那么这种情况可以使用__autoreleasing。他被经常用于函数有值参数返回时的处理,比如下面的例子。

1
2
3
4
5
6
7
8
9
10
11
- (void) generateErrorInVariable:(__autoreleasing NSError **)paramError {
    ....
    *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary];
}

....
{
    NSError *error = nil;
    [self generateErrorInVariable:&error];
    NSLog(@"Error = %@", error);
}

又如函数的返回值是在函数中申请的,那么希望释放是在调用端时,往往有下面的代码。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
-(NSString *)stringTest
{
    NSString *retStr = [NSString stringWithString:@"test"];

    return [[retStr retain] autorelease];
}

// 使用ARC

-(NSString *)stringTest
{
    __autoreleasing NSString *retStr = [NSString alloc] initWithString:@"test"];

    return retStr;
}

即当方法的参数是id*,且希望方法返回时对象被autoreleased,那么使用该关键字。

总结

今天,我们看到了基本的ARC使用规则

    代码中不能使用retain, release, retain, autorelease

    不重载dealloc(如果是释放对象内存以外的处理,是可以重载该函数的,但是不能调用[super dealloc])

    不能使用NSAllocateObject, NSDeallocateObject

    不能在C结构体中使用对象指针

    id与void *间的如果cast时需要用特定的方法(__bridge关键字)

    不能使用NSAutoReleasePool、而需要@autoreleasepool块

    不能使用“new”开始的属性名称 (如果使用会有下面的编译错误”Property’s synthesized getter follows Cocoa naming convention for returning ‘owned’ objects”)

原文了链接:http://www.yifeiyang.net/development-of-the-iphone-simply-1/

分享到:
评论

相关推荐

    免下载旧版code,现成arc包拖入xcode既可解决

    Xcode14.3 File not found libarclite_iphonesimulator.a and libarclite_iphoneos.a,xocde14.3会删除xocde的arc文件夹,致使项目报错,解决办法,把旧版arc包拖入xocde即可

    libarclite-iphoneos.a

    https://github.com/kamyarelyasi/Libarclite-Files中的libarclite_iphoneos.a

    arc文件包:解决Xcode 15 libarclite 文件缺失问题

    前往文件夹 /Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/ 将下载的arc 文件夹复制到lib文件夹下

    Beginning iPhone Development:Exploring the iPhone SDK

    - **内存管理**:理解ARC(自动引用计数)的工作原理,避免内存泄漏等问题。 - **多线程编程**:介绍如何利用Grand Central Dispatch (GCD) 和NSOperationQueue等技术进行并发编程。 - **性能监控**:使用...

    iOS 5 arc 指南

    ### iOS 5 ARC指南知识点详解 #### 自动引用计数(ARC)介绍 - **ARC的概念**:在iOS 5中引入的一项重要技术——自动引用计数(Automatic Reference Counting, ARC),它极大地简化了内存管理的工作。通过ARC,开发者...

    iOS 5 ARC完全指南

    ### iOS 5 ARC完全指南知识点解析 #### 一、ARC简介 **自动引用计数(Automatic Reference Counting, ARC)** 是iOS 5引入的一项重要技术特性,它旨在减轻开发者在Objective-C编程过程中对内存管理的手动负担。通过...

    iPhone应用程序编程指南-中文版 pdf

    iOS的内存管理机制基于Automatic Reference Counting (ARC),开发者需要理解引用计数的工作原理以避免内存泄漏。 最后,这本书可能会讨论iOS的权限系统,如隐私权限,以及如何适配不同的iOS设备和版本,确保应用的...

    Learn cocos2d 2.pdf 高清最新原版(ARC)

    需要注意的是,Cocos2d中的某些API可能需要进行修改以兼容ARC,例如,旧版本的Cocos2d使用autorelease来管理对象,这在ARC环境下不再适用。 - **ARC兼容性问题**:在某些情况下,Cocos2d中的特定API可能与ARC不完全...

    beginning iphone 4 development

    此外,还会介绍ARC(Automatic Reference Counting)机制,帮助开发者避免常见的内存泄漏问题。 网络功能在许多应用中都是不可或缺的,书中会介绍如何使用URLSession进行数据请求,以及JSON解析和XML处理。此外,也...

    iPhoneQQ在线源码

    9. **性能优化**:源码可能包含了一些性能优化技巧,比如内存管理(ARC)、缓存策略、懒加载等,以提升应用的响应速度和资源利用效率。 10. **第三方库集成**:除了Apple官方提供的框架,开发过程中可能还引入了...

    iPhone Instruments工具使用

    修复内存泄露的关键是遵循正确的内存管理规则,如Objective-C的ARC(Automatic Reference Counting)或C++的智能指针。在Objective-C中,确保每次`alloc`、`copy`、`new`或`init`之后都有相应的`release`、`...

    iphone7-原理图.pdf

    ARC: DRIVER (弧形驱动器)** - 可能是指驱动弧形部件(如曲面屏幕)的电路。 **8. SYSTEM POWER (系统供电)** - **PMU (1/3), (2/3), (3/3)**: 分别表示电源管理单元的不同部分,这些部分共同负责整个系统的电力...

    iOS-ARC编程指南

    关于iPhone开发当中arc部分的编程要点介绍,很不错,推荐一下

    libarclite-arc,xcode, 解决 Xcode 14.3,Xcode 15 旧项目可能报错

    Xcode 14.3,Xcode 15 旧项目可能报错 SDK does not contain 'libarclite' at the path '/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/lib/arc/libarclite_iphonesimulator...

    转向ARC的说明

    ARC是一个编译器特征,它提供了对OC对象自动管理内存。ARC让开发者专注于感兴趣的代码和对象的关系,而不用考虑对象的retain和release

    如何学好Iphone开发

    学习iPhone开发是一个系统而全面的过程,它涉及到编程基础、开发工具、框架掌握等多个方面。文章以《如何学好iPhone开发》为主题,详细阐述了学习iPhone游戏开发所需的基础知识、推荐的学习资源、开发工具的运用、...

    50张iPhone 6S详细电路原理图

    - 文件中提到了多个与音频相关的部件,如“AUDIO: CALTRACODEC”、“AUDIO: SPEAKER DRIVER”、“AUDIO: ARC DRIVER”,这些分别代表音频编解码器、扬声器驱动器以及耳返驱动器等。 5. **Cellular (蜂窝通信模块)*...

    iphone xcode 手机开发

    后来引入了垃圾回收(GC)和ARC(Automatic Reference Counting),大大简化了内存管理。 9. **块(Block)**:Objective-C支持内联代码块,这是一种强大的闭包实现,可以捕获并操作当前作用域内的变量,常用于异步...

Global site tag (gtag.js) - Google Analytics