`
天梯梦
  • 浏览: 13742837 次
  • 性别: 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应用开发PDF版

    《高性能iOS应用开发》这本书是iOS开发者们提升应用性能的重要参考资料。它专注于提供实用的技巧和最佳实践,帮助开发者在iOS平台上创建出运行流畅、效率卓越的应用程序。这本书的PDF版便于阅读和存储,可以轻松转换...

    最新IOS5开发基础(含ARC,Storyboard,ICloud等)

    这是一本专为初学者设计的iOS开发指南,旨在帮助读者快速掌握iOS应用开发的基础知识和技术要点。 **作者简介**: - **David Mark**:拥有超过20年的软件开发经验,专注于移动应用开发领域。 - **Jack Nutting**:...

    iOS 9.1应用开发基础教程

    在本教程中,我们将深入探讨“iOS 9.1应用开发基础”,这是一门适合初学者的课程,旨在帮助你掌握Apple的移动操作系统上的应用程序构建技术。iOS 9.1是苹果公司为iPhone、iPad以及iPod touch设备推出的一个重要版本...

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

    **iOS应用开发中的ARC内存管理方式详解** **一、ARC的引入与启用** ARC(Automatic Reference Counting),自iOS 5起成为Objective-C的一个重要特性,它极大地简化了内存管理,由编译器自动处理对象的引用计数,...

    Beginning iOS 6 Development Exploring the iOS SDK

    这本书面向的是对iOS编程感兴趣的初学者,通过系统性的讲解,帮助他们构建扎实的iOS应用开发技能。 首先,书中会介绍iOS开发的基础知识,包括Xcode IDE的使用,它是Apple官方提供的集成开发环境,包含了编写、调试...

    iOS 5 ARC完全指南

    《iOS 5 ARC完全指南》深入解析了自动引用计数(Automatic Reference Counting,简称ARC)在iOS开发中的应用与工作原理。ARC是苹果在iOS 5中引入的一项技术革新,旨在简化内存管理,减少开发者在手动管理内存时可能...

    Ios学习代码:OC课程代码

    在iOS开发领域,Objective-C(简称OC)是Apple官方支持的主要编程语言之一,它为构建iOS应用程序提供了强大的基础。"Ios学习代码: OC课程代码"这个资源集合了作者在学习Objective-C过程中编写的示例代码,涵盖了OC的...

    ios应用源码之两个计算器的源代码 ing_calculator_1.53 2018127

    2. **UIKit框架**:这是iOS应用开发的核心,用于构建用户界面。Calculator应用可能使用了`UILabel`(显示数字和运算符)、`UIButton`(作为键盘按钮)和`UIView`(容器)等控件。 3. **MVC设计模式**:Model-View-...

    ios9 单例模式区分arc与非arc宏的使用

    首先,我们了解什么是ARC和非ARC。ARC是Apple引入的一种内存管理机制,自动管理对象的生命周期,避免了手动引用计数的繁琐。而非ARC的项目则需要开发者手动进行内存管理,如使用`retain`、`release`、`autorelease`...

    iOS开发进阶-完整版

    通过以上这些知识点的介绍,《iOS开发进阶》这本书旨在帮助初级开发者快速掌握iOS应用程序开发的核心技术和最佳实践,并能够通过实战项目进一步提升自己的技术水平。无论是对于想要深入了解iOS开发细节的专业人士...

    iOS应用性能为剖析.pdf.zip

    在iOS应用开发中,性能是决定用户体验的关键因素之一。这份"iOS应用性能为剖析.pdf.zip"的压缩包文件,提供了一份深入探讨高性能iOS应用开发的资料,尤其关注用户界面、网络开发、内存管理、数据库、能耗、并发以及...

    Pro iOS 5 Tools: Xcode Instruments and Build Tools

    本书记载了关于iOS 5开发的重要工具和技术,包括Xcode、Instruments和其他构建工具的使用方法。书中通过一个购物车应用的例子,介绍了如何从创建项目到使用分布式版本控制系统设置环境的全过程,并深入探讨了如何...

    企业级ios应用开发实践14

    在企业级iOS应用开发实践中,开发者需要掌握一系列高级技术和最佳实践,以确保应用程序的质量、稳定性和安全性。本章聚焦于使用Xcode、Objective-C进行iOS应用开发的关键环节,旨在为开发者提供深入的理解和实用技巧...

    iOS开发规范指南.zip

    在iOS开发过程中,遵循...这份“iOS开发规范指南”提供了全面的指导,旨在帮助开发者遵循最佳实践,打造高效、稳定且易于维护的iOS应用。通过深入理解和应用这些知识点,开发者可以显著提升其在iOS平台上的专业技能。

    IOS应用源码Demo-翻页(电子书?)-毕设学习.zip

    )-毕设学习.zip" 涉及的核心知识点主要集中在iOS应用开发上,特别是针对电子书或类似翻页效果的实现。在iOS开发中,这类功能通常涉及到UI设计、动画处理、数据加载等多个方面。以下是对这些知识点的详细解释: 1. ...

    IOS应用源码Demo-电子书阅读器 - iOS PDF Reader-毕设学习.zip

    总的来说,这个源码示例是一个宝贵的教育资源,可以帮助学习者深入理解iOS应用开发的各个方面,包括UI设计、数据处理、性能优化和软件工程实践。尽管技术在不断更新,但基础知识和编程原理依然适用,因此这个项目...

    IOS应用源码——ios相册左右滑动的.zip

    标题中的“IOS应用源码——ios相册左右滑动的.zip”表明这是一份iOS应用的源代码,特别关注的是相册功能,该功能...这将是一个很好的机会,不仅可以学习如何实现特定的用户交互,还可以提升对iOS应用开发的整体理解。

    Arcengine二次开发的宝典级电子书.rar

    7. **移动GIS开发**:介绍如何利用ArcEngine为移动设备开发GIS应用,包括Windows Mobile、Android或iOS平台的集成与应用开发。 8. **性能优化**:讨论在开发过程中如何提升应用程序的性能,包括数据缓存策略、多...

    iOS计算器开发源码

    在iOS平台上开发一款计算器应用,通常涉及到Objective-C或Swift编程语言,以及苹果的开发...通过学习和实践这个项目,开发者不仅可以掌握iOS应用的基础开发,还能深化对UI设计、计算逻辑、屏幕适配等核心概念的理解。

    iOS软件开发规范

    iOS软件开发规范是确保应用程序质量、可维护性和团队协作效率的关键文档。在iOS开发中,遵循一定的规范可以提高代码的可读性,降低错误率,同时使得代码更加整洁和易于理解。以下是一些核心的iOS开发规范: 1. **...

Global site tag (gtag.js) - Google Analytics