- 浏览: 13742837 次
- 性别:
- 来自: 洛杉矶
文章分类
- 全部博客 (1994)
- Php / Pear / Mysql / Node.js (378)
- Javascript /Jquery / Bootstrap / Web (435)
- Phone / IOS / Objective-C / Swift (137)
- Ubuntu / Mac / Github / Aptana / Nginx / Shell / Linux (335)
- Perl / Koha / Ruby / Markdown (8)
- Java / Jsp (12)
- Python 2 / Wxpython (25)
- Codeigniter / CakePHP (32)
- Div / Css / XML / HTML5 (179)
- WP / Joomla! / Magento / Shopify / Drupal / Moodle / Zimbra (275)
- Apache / VPN / Software (31)
- AS3.0/2.0 / Flex / Flash (45)
- Smarty (6)
- SEO (24)
- Google / Facebook / Pinterest / SNS (80)
- Tools (22)
最新评论
-
1455975567:
xuezhongyu01 写道wocan23 写道我想问下那个 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
xuezhongyu01:
wocan23 写道我想问下那个111.1是怎么得来的我也看不 ...
Mysql: LBS实现查找附近的人 (两经纬度之间的距离) -
18335864773:
试试 pageoffice 在线打开 PDF 文件吧. pag ...
jquery在线预览PDF文件,打开PDF文件 -
青春依旧:
opacity: 0.5; 个人喜欢这种方式!关于其他css特 ...
css透明度的设置 (兼容所有浏览器) -
July01:
推荐用StratoIO打印控件,浏览器和系统的兼容性都很好,而 ...
搞定网页打印自动分页问题
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
- 生成对象时,使用autorelease
- 对象代入时,先autorelease后再retain
- 对象在函数中返回时,使用return [[object retain] autorelease];
而使用ARC后,我们可以不需要这样做了,甚至连最基础的release都不需要了。
使用ARC有什么好处呢?
- 看到上面的例子,大家就知道了,以后写Objective-C的代码变得简单多了,因为我们不需要担心烦人的内存管理,担心内存泄露了
- 代码的总量变少了,看上去清爽了不少,也节省了劳动力
- 代码高速化,由于使用编译器管理引用计数,减少了低效代码的可能性
- 记住一堆新的ARC规则 — 关键字及特性等需要一定的学习周期
- 一些旧的代码,第三方代码使用的时候比较麻烦;修改代码需要工数,要么修改编译开关
关于第二点,由于 XCode4.2 中缺省ARC就是 ON 的状态,所以编译旧代码的时候往往有"Automatic Reference Counting Issue"的错误信息。
这个时候,可以将项目编译设置中的“Objectice-C Auto Reference Counteting”设为NO。如下所示。
如果只想对某个.m文件不适应ARC,可以只针对该类文件加上 -fno-objc-arc 编译FLAGS,如下图。
- retain, release, autorelease, dealloc由编译器自动插入,不能在代码中调用
- dealloc虽然可以被重载,但是不能调用[super dealloc]
由于ARC并不是GC,并需要一些规则让编译器支持代码插入,所以必须清楚清楚了这些规则后,才能写出健壮的代码。
ObjectiveC中的对象,有强参照(Strong reference)和弱参照(Weak reference)之分,当需要保持其他对象的时候,需要retain以确保对象引用计数加1。对象的持有者(owner)只要存在,那么该对象的强参照就一直存在。
- 只要对象的持有者存在(对象被强参照),那么就可以使用该对象
- 对象失去了持有者后,即被破弃
强参照 (Strong reference)
(s1)
firstName作为”natsu”字符串对象的最初持有者,是该NSString类型对象的Strong reference。
这里将firstName代入到aName中,即aName也成为了@”natsu”字符串对象的持有者,对于该对象,aName也是Strong reference。
这里,改变firstName的内容。生成新的字符串对象”maki”。这时候firstName成为”maki”的持有者,而@”natsu”的持有者只有aName。每个字符串对象都有各自的持有者,所以它们都在内存中都存在。
追加新的变量otherName, 它将成为@”maki”对象的另一个持有者。即NSString类型对象的Strong reference。
将otherName代入到aName,这时,aName将成为@”maki”字符串对象的持有者。而对象@”natsu”已经没有持有者了,该对象将被破弃。
弱参照 (Weak reference)
接下来我们来看看弱参照 (Weak reference) 的使用方式。
(w1)
与强参照方式同样,firstName作为字符串对象@”natsu”的持有者存在。即是该NSString类型对象的Strong reference。
使用关键字__weak,声明弱参照weakName变量,将firstName代入。这时weakName虽然参照@”natsu”,但仍是Weak reference。即weakName虽然能看到@”natsu”,但不是其持有者。
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,那么使用该关键字。
- 代码中不能使用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/
发表评论
-
手机firebug查看网页代码 How to View Website Source Codes on iPad / iPhone
2016-04-26 02:41 1172You’re using your iPad to br ... -
Android模拟器genymotion的安装和使用
2016-03-18 01:16 2531Genymotion概述 Genymotion是一套完整的 ... -
编码之道:取个好名字很重要
2015-10-14 05:19 1176代码就是程序员的孩子,给“孩子”取个好听的名字很重 ... -
Genymotion - 强大好用高性能的 Android 模拟器 (在电脑流畅运行APK安卓软件游戏的利器)
2015-06-05 13:34 7394随着 Android 系统的应用和游戏越来越丰富,甚至有 ... -
收集几个移动平台浏览器的User-Agent
2014-07-23 02:33 3033List of all Mobile Browsers ... -
常用浏览器修改User-Agent的方法
2014-06-28 02:58 10989之前有介绍收集的几个移动平台浏览器的User-Agent,以 ... -
更简洁的方式修改Chrome的User Agent,轻松体验移动版网络
2014-06-28 02:53 6949国庆节在家宅着,使用3g上网卡上网,和在公司上网不一样的是 ... -
3个检测浏览器User-Agent信息的网站
2014-06-28 02:52 2563刚刚在收集各个移动平台浏览器的User-Agent(参见这 ... -
根据移动设备屏幕像素密度,给予不同分辨率的图片
2014-06-26 00:52 2975在出现iphone4之前的相当长的时间内,网站开发人员 ... -
视网膜New iPad与普通分辨率iPad页面的兼容处理
2014-06-26 00:44 1346一、这是篇经验分享 ... -
iOS8开发-Swift编程
2014-06-25 00:45 1910课时列表 章节1:第一个Swift应用 ... -
Swift中文教程(二十三) 高级运算符
2014-06-25 00:43 830除了基本操作符中所讲的运算符,Swift还有许多复杂的高级 ... -
Swift中文教程(二十二) 泛型
2014-06-25 00:35 1074泛型代码可以让你写出根据自我需求定义、适用于任何类型的,灵 ... -
Swift中文教程(二十一) 协议
2014-06-24 05:25 1463Protocol(协议)用于统一方法和属性的名称,而不实现任 ... -
Swift中文教程(二十) 扩展
2014-06-24 00:47 739扩展就是向一个已有的类、结构体或枚举类型添加新功能(fun ... -
Swift中文教程(十九) 类型嵌套
2014-06-24 00:44 933枚举类型常被用于实现特定类或结构体的功能。也能够在有多种变量 ... -
Swift中文教程(十八) 类型检查
2014-06-24 00:41 779类型检查是一种检查类实例的方式,并且或者也是让实例作为它的 ... -
Swift中文教程(十七) 可选链
2014-06-17 05:11 908可选链(Optional Chaining)是一种可以请求 ... -
Swift中文教程(十六) 自动引用计数
2014-06-17 05:05 1294Swift使用自动引用计数(ARC)来管理应用程序的内存使 ... -
Swift中文教程(十五) 析构
2014-06-17 04:57 1040在一个类的实例被释放之前,析构函数会被调用。用关键字dei ...
相关推荐
《高性能iOS应用开发》这本书是iOS开发者们提升应用性能的重要参考资料。它专注于提供实用的技巧和最佳实践,帮助开发者在iOS平台上创建出运行流畅、效率卓越的应用程序。这本书的PDF版便于阅读和存储,可以轻松转换...
这是一本专为初学者设计的iOS开发指南,旨在帮助读者快速掌握iOS应用开发的基础知识和技术要点。 **作者简介**: - **David Mark**:拥有超过20年的软件开发经验,专注于移动应用开发领域。 - **Jack Nutting**:...
在本教程中,我们将深入探讨“iOS 9.1应用开发基础”,这是一门适合初学者的课程,旨在帮助你掌握Apple的移动操作系统上的应用程序构建技术。iOS 9.1是苹果公司为iPhone、iPad以及iPod touch设备推出的一个重要版本...
**iOS应用开发中的ARC内存管理方式详解** **一、ARC的引入与启用** ARC(Automatic Reference Counting),自iOS 5起成为Objective-C的一个重要特性,它极大地简化了内存管理,由编译器自动处理对象的引用计数,...
这本书面向的是对iOS编程感兴趣的初学者,通过系统性的讲解,帮助他们构建扎实的iOS应用开发技能。 首先,书中会介绍iOS开发的基础知识,包括Xcode IDE的使用,它是Apple官方提供的集成开发环境,包含了编写、调试...
《iOS 5 ARC完全指南》深入解析了自动引用计数(Automatic Reference Counting,简称ARC)在iOS开发中的应用与工作原理。ARC是苹果在iOS 5中引入的一项技术革新,旨在简化内存管理,减少开发者在手动管理内存时可能...
在iOS开发领域,Objective-C(简称OC)是Apple官方支持的主要编程语言之一,它为构建iOS应用程序提供了强大的基础。"Ios学习代码: OC课程代码"这个资源集合了作者在学习Objective-C过程中编写的示例代码,涵盖了OC的...
2. **UIKit框架**:这是iOS应用开发的核心,用于构建用户界面。Calculator应用可能使用了`UILabel`(显示数字和运算符)、`UIButton`(作为键盘按钮)和`UIView`(容器)等控件。 3. **MVC设计模式**:Model-View-...
首先,我们了解什么是ARC和非ARC。ARC是Apple引入的一种内存管理机制,自动管理对象的生命周期,避免了手动引用计数的繁琐。而非ARC的项目则需要开发者手动进行内存管理,如使用`retain`、`release`、`autorelease`...
通过以上这些知识点的介绍,《iOS开发进阶》这本书旨在帮助初级开发者快速掌握iOS应用程序开发的核心技术和最佳实践,并能够通过实战项目进一步提升自己的技术水平。无论是对于想要深入了解iOS开发细节的专业人士...
在iOS应用开发中,性能是决定用户体验的关键因素之一。这份"iOS应用性能为剖析.pdf.zip"的压缩包文件,提供了一份深入探讨高性能iOS应用开发的资料,尤其关注用户界面、网络开发、内存管理、数据库、能耗、并发以及...
本书记载了关于iOS 5开发的重要工具和技术,包括Xcode、Instruments和其他构建工具的使用方法。书中通过一个购物车应用的例子,介绍了如何从创建项目到使用分布式版本控制系统设置环境的全过程,并深入探讨了如何...
在企业级iOS应用开发实践中,开发者需要掌握一系列高级技术和最佳实践,以确保应用程序的质量、稳定性和安全性。本章聚焦于使用Xcode、Objective-C进行iOS应用开发的关键环节,旨在为开发者提供深入的理解和实用技巧...
在iOS开发过程中,遵循...这份“iOS开发规范指南”提供了全面的指导,旨在帮助开发者遵循最佳实践,打造高效、稳定且易于维护的iOS应用。通过深入理解和应用这些知识点,开发者可以显著提升其在iOS平台上的专业技能。
)-毕设学习.zip" 涉及的核心知识点主要集中在iOS应用开发上,特别是针对电子书或类似翻页效果的实现。在iOS开发中,这类功能通常涉及到UI设计、动画处理、数据加载等多个方面。以下是对这些知识点的详细解释: 1. ...
总的来说,这个源码示例是一个宝贵的教育资源,可以帮助学习者深入理解iOS应用开发的各个方面,包括UI设计、数据处理、性能优化和软件工程实践。尽管技术在不断更新,但基础知识和编程原理依然适用,因此这个项目...
标题中的“IOS应用源码——ios相册左右滑动的.zip”表明这是一份iOS应用的源代码,特别关注的是相册功能,该功能...这将是一个很好的机会,不仅可以学习如何实现特定的用户交互,还可以提升对iOS应用开发的整体理解。
7. **移动GIS开发**:介绍如何利用ArcEngine为移动设备开发GIS应用,包括Windows Mobile、Android或iOS平台的集成与应用开发。 8. **性能优化**:讨论在开发过程中如何提升应用程序的性能,包括数据缓存策略、多...
在iOS平台上开发一款计算器应用,通常涉及到Objective-C或Swift编程语言,以及苹果的开发...通过学习和实践这个项目,开发者不仅可以掌握iOS应用的基础开发,还能深化对UI设计、计算逻辑、屏幕适配等核心概念的理解。
iOS软件开发规范是确保应用程序质量、可维护性和团队协作效率的关键文档。在iOS开发中,遵循一定的规范可以提高代码的可读性,降低错误率,同时使得代码更加整洁和易于理解。以下是一些核心的iOS开发规范: 1. **...