`
天梯梦
  • 浏览: 13612121 次
  • 性别: Icon_minigender_2
  • 来自: 洛杉矶
社区版块
存档分类
最新评论

iOS应用开发:什么是ARC?

 
阅读更多

 

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前后的变化点。

 

@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  
 

 

@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 开始导入。由于该类型不影响对象的生命周期,所以如果对象之前就没有持有者,那么会出现刚创建就被破弃的问题,比如下面的代码。

 

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。他被经常用于函数有值参数返回时的处理,比如下面的例子。

  
- (void) generateErrorInVariable:(__autoreleasing NSError **)paramError {  
    ....  
    *paramError = [[NSError alloc] initWithDomain:@"MyApp" code:1 userInfo:errorDictionary];  
}  
 
....  
{  
    NSError *error = nil;  
    [self generateErrorInVariable:&error];  
    NSLog(@"Error = %@", error);  
}  
 

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

 

-(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/

 

 

 

 

分享到:
评论

相关推荐

    ios开发技巧总结.docx

    熟悉Swift或Objective-C:Swift是苹果推荐的iOS应用开发语言,它具有安全性、高性能和现代编程特性。虽然Objective-C仍可使用,但新项目建议优先考虑Swift。 理解MVC架构:iOS应用遵循Model-View-Controller(MVC)...

    尚乘教育_iOS_开发培训课程

    尚乘教育_iOS_开发培训课程_01_一个简单的_iOS_应用.pdf 尚乘教育_iOS_开发培训课程_02_Objective-C.pdf 尚乘教育_iOS_开发培训课程_03_使用_ARC_管理内存.pdf 尚乘教育_iOS_开发培训课程_04_Delegation_and_Core_...

    详解iOS应用开发中的ARC内存管理方式

    主要介绍了详解iOS应用开发中的ARC内存管理方式,文中示例基于Objective-C语言,需要的朋友可以参考下

    iOS开发UI框架

    iOS应用开发框架,模板,含App第一次启动的引导页面,基视图控制器为App应用常用UITabBarController(分页栏),App图标,启动画面均有设置,采用ARC模式

    iOS开发进阶-完整目录-高清

    iOS开发进阶 唐巧 完整目录 高清 讲述了开发过程中一些工具的应用。和一些重要的知识点 如ARC block。

    iOS开发者专题(包含文档和DEMO源码)

    02.第一个iOS应用 03.了解iOS内存管理 04.解析ARC原理 05.delegate模式 06.可扩展的服务端API 07.主流开发框架介绍 08.构建完整应用——架构篇 09.构建完整应用——编码篇 10.如何提交AppStore审核 11.应用实战——...

    java多态的笔试题-iOS-interview:遵循iOS开发人员/工程师面试指南

    Java多态的笔试题iOS-面试 准备 面试前 | | | | | | | 文件夹 文件夹1. 2. 3. 4. scalsys.com 5. 6. 7. [简历]() iOS(快速): 理论 - 实用(快速知识)- 实用(iOS知识)- 数据结构和算法 - 阿尔格: 麻省理工学院...

    精通Object-C:从基础到高级项目实践.docx

    本教程旨在为初学者和中级...简单的iOS应用开发 MacOS桌面软件开发 项目实践 项目1:待办事项应用 项目2:天气预报应用 项目3:简单的社交网络客户端 进阶资源和社区 推荐书籍和在线课程 论坛和社区 开源项目 结语:

    InAppPurchaseManager:用于 iOS 开发的应用内购买的单例类

    用于 iOS 开发的应用内购买的单例类(仅限非消耗品)ARC 兼容 用法 注意StoreKit 不适用于模拟器。 您必须在物理设备上进行测试。 对于已经通过 iTunes Connect 设置应用内购买的项目来说,这是一个不错的选择。 ...

    史上最全的ios开发源码

    苹果iOS是由苹果公司开发的手持设备操作系统。苹果公司最早于2007年1月9日的Macworld大会上公布这个系统,最初是设计给iPhone使用的,后来陆续套用到iPod touch、iPad以及Apple TV等苹果产品上。iOS与苹果的Mac OS X...

    EyeEm-iOS-SDK:简单的iOS SDK可以访问EyeEm API

    它使用ARC,因此开发目标是5.0。 请首先阅读我们的主要。 , 和。入门在注册您的应用在您的.h文件中放入#import "EyeEmAPI.h" 要初始化API,请使用[[EyeEmAPI alloc] initWithClientId:client_id] 如果尚未将项目与...

    MVVM_ARC_Demo:我写了一些MVVM和ARC演示。 非常有利于学习

    MVVM ARC演示 我写了一些MVVM和ARC演示。 非常有利于学习。 什么是MVVM? 模型视图ViewModel(MVVM)是用于软件开发的体系结构模式。 MVVM是Martin Fowler的Presentation ...什么是ARC(ReactiveCocoa)? Reactive

    ios开发记录

    //此方法可以有参数,也可以没有参数,如果没有参数系统不会给你穿参数,如果有参数,只能有一个参数,无论你所指定的参数类型是什么,系统只会把tf本身给传过去 [tf addTarget:self action:@selector(down:) ...

    RookieSixt:Sixt iOS应用程序测试

    #Sixt iOS应用测试 您是一位热情洋溢的iOS开发人员,正在寻找新的挑战吗? 试试我们针对iOS申请人的编码测试。 ##任务说明该项目提供了一个新应用程序的基本结构,该应用程序表示来自JSON数据源(offers.json)的...

    iOS ARC 完全指南

    iOS ARC 完全指南OS5ARC完全指南 GuanGyi Inc http://www.gungyi.com ARC完全指南 最显著的变化就是增加了 动引用计数)。是新 编译器的特性,完全消除了手动内 存管理的烦琐。在你的项目中使用是非常简单的,所有的...

    JCNavigator:用于iOS开发的模块或应用程序之间跳转的解耦导航器框架

    用于iOS开发的模块或应用程序之间跳转的分离导航器框架。 特征 该框架支持在ARC中开发iOS 8.0+。 JCNavigator配置。 实施模块映射。 使用方法openURL:或openWithMapKey:跳转操作。 模块之间传递的参数。 ...

    IOS开发代码工具集合+项目模板

    源码zzCommonProject,本项目由zzzili提供源码 这是一个轻量级的ios开发工具包(zzCommon) 工具包内包含了ios开发中常用的一些实体类工具,包括(异步图片下载、自动版本更新、JSON字符串解析、POST请求等),宗旨在为...

    破解Objective-C面试:笑到最后的技术攻略!.zip

    用途:本内容适用于准备Objective-C相关技术面试的求职者,特别是那些想要进入iOS或Mac OS X应用开发领域的人。这些面试题和解答可以帮助他们更好地理解Objective-C的核心概念和编程实践,从而在面试中表现出色。...

    objc-高级编程

     这些新技术在App应用开发时不可或缺。它们看似简单,但若无深入了解,就会变成技术开发的陷阱。本书在苹果公司公开的源代码基础上加以解说,深入剖析,这些内容是仅靠阅读苹果公司的参考文档而难以企及的。

Global site tag (gtag.js) - Google Analytics