ARC简介以及工程中ARC与非ARC的混合

工业4.0 底层逻辑 工业4.0 的概念已经被滥用了,它与物联网,工业物联网等概念一样,几乎什么都往里面装。演变成了一句口号和愿景。许多人并不清楚工业4.0的底层逻辑到底是什么?如何遵循工业4.0 的思想构建新一代智能制造系统?并没用清晰地展示工业4.0的技术路线图。 阅读详情

ARC与非ARC在一个项目中同时使用,

1,选择项目中的Targets,选中你所要操作的Target,
2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc

混用没有问题,没有用ARC的代码继续坚持谁申请谁释放就好了。以前的库没有时间重写,都采用这种方法。

而且不知道你用的是什么第三方代码,一般来说,现在很少有arc only的代码,大部分都是用一些宏来让代码可以同时适应arc和非arc的(用#if __has_feature(objc_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是编译器LLVM 3.0的新功能,而非iOS,因此ARC支持 Mac OS X v10.6 v10.7 (64-bit applications) 以及 iOS 4 iOS 5. (遗憾的是,weak reference 是runtime属性,因此 不支持 iOS 4 和 Mac OS X v10.6。)

你不能使用new开头的变量

ARC只对objective-c对象起作用,对于Core Foundation 之类,你仍然需要自己手动释放。

ARC的优势:
1、不再需要考虑retain、release的问题,我们得以在更高的层面考虑问题,而不是纠结于什么时候释放的细节。
2、zeroing-weak reference , 我们终于可以摆脱烦人的 zombies 对象,想想delegate机制,当delegate对象deallocated之后,你再向它发消息会发生什么?现在当你调用 self.delegate 时,如果它被释放,那么这个弱指针会自动变为 nil 。
3、ARC给人的感觉是直接存对象到变量里面。因此之前一段不可能的代码现在也变为可能:

 

变化点

通过一小段代码,我们看看使用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)

(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”)

 

Part 1:
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
Part 2:
http://www.raywenderlich.com/5773/beginning-arc-in-ios-5-tutorial-part-2

Apple 文档
http://developer.apple.com/library/IOs/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html


原文

桌面运维工程师面试题汇总(高频完整版) 岗位,覆盖:电脑硬件、系统安装与故障、网络、办公软件、安全、AD域、打印机、日常排错、服务意识。 阅读详情

相关推荐

QSPI Flash的原理与QSPI时序的Verilog实现

本节主要是讨论QSPI(Quad SPI,四线SPI总线)的相关内容。我的开发板上有一片型号是W25Q128BV的Quad SPI Flash存储器,本文将以它为例子来说明QSPI操作的一些内容。

Go Forward Forever! 4164

如何快速判断一个工程是否使用ARC

原来这么简单哩:(工程 Build Settings 里搜 auto,出来有个叫 Automic Reference Counting 的,如果为YES即说明此工程使用了ARC

沸腾的泪水的专栏 4099

从理论到波形:NE555多谐振荡器设计与示波器实战验证

本文详细介绍了NE555多谐振荡器的设计原理与实战验证方法。从基础理论到电路参数计算,再到面包板搭建与示波器测量,全面解析如何利用NE555芯片实现稳定的方波输出。通过实际案例演示了频率调整、占空比优化等技巧,并提供了常见问题排查指南,帮助电子爱好者快速掌握这一经典电路设计。

weixin_29159613的博客 279

ARC项目引入非ARC项目

ARC项目引入非ARC项目,快捷支持方法

写而习备之,无悔也! 716

VirtualLab初学者教程-1.用户界面

目录前言一、VirtualLab Fusion简介1.软件2.内置工具箱:二、用户界面认识1.上方菜单栏2.右侧面主窗口3.底部窗口附 前言 感觉做VirtualLab的资料不是特别多,可能用的朋友也比较少吧,笔者最近也因为大创需要刚刚开始入门,把网上有的英文资料整理了一下,加了一点自己的内容发出来希望帮助更多在学习中的朋友,有用词不当之处还请多多包涵。 一、VirtualLab Fusion简介 因为是第一讲,简单啰嗦一下软件本身,参考官方介绍。 1.软件 VirtualLab是由德国LightTran

ClaireTang1的博客 2万+

统信UOS系统盘空间不足?5分钟搞定扩容的图形化解决方案

本文提供统信UOS系统盘空间不足的图形化扩容解决方案,使用GParted分区编辑器在不丢失数据的情况下快速完成扩容。详细步骤包括准备工作、空间调整和执行验证,适合技术用户快速解决问题。

d6e7f8的博客 955

非ARC和ARC项目互转

工程->target->Build Phases->Compile Sources 对相应的文件添加:-fobjc-arc参数

xyxjn的专栏 2392

将赛灵思 SDK 工程移植到 Vitis 的分步指南

注:本文转自赛灵思中文社区论坛,源文链接在此。本文原作者为XILINX工程师。 以下为个人译文,仅供参考,如有疏漏之处,还请不吝赐教。 您是赛灵思软件开发套件 (SDK) 用户吗? 您是否正在计划将自己的工程移植到 Vitis 软件平台? 那么本篇工程移植分步指南将能祝您一臂之力。 从 2019.2 版开始,赛灵思 SDK 开发环境已统一整合到全功能一体化的 Vitis™ 统一软件平台中。 尊敬的 SDK 用户,您只需轻点几下鼠标即可体验这一功能丰富的工具! 马上开始将工程从赛灵思 S

weixin_45825101的博客 1731

arc-web项目总结

此项目用到react+antd技术 react的原理: store reducer action 当action发起一个动作后,reducer 有可能改变store数据的变化,数据发生变化之后,则会重新render一下页面,因为数据是和组件绑定在一起的,数据发生变化之后,重新渲染页面,并不是刷新这个页面,而是去到跟变化的数据绑定的组件,仅仅刷新这个组件而已。 props和state的...

weixin_30532369的博客 264

STM32F407实现LwIP的MQTT客户端并连接到服务器

这个是用LwIP协议栈中自带的MQTT客户端API写成的,代码注释很详细,附带有服务端的展示。LwIP版本是2.1.2.

wait_for_STM32的博客 6394

Ubuntu20.04安装Torque-6.1.2单机版(踩坑篇)

说明:PBS排队系统原先是在Centos7安装使用很顺利,但是有客户需求在Ubuntu20.04上使用,着手在Ubuntu20.04安装上安装的时候发现很多报错,并不能顺利安装,网上查找到的教程,有的说是让放弃转slurm,有的是换源安装,但是安装好的版本很低,有许多bug,不是很好用。经过自己慢慢摸索之后,改了部分配置以及源码之后,能够顺利安装,再次记录一下踩坑心得,与大家一起分享学习。如有问题,欢迎大家来撩。...............

华青水上的博客 8087

技巧-在ARC项目中,兼容非ARC项目文件做法

在Build Phases>>>>> -fno-objc-arc 非ARC模式

ARC_KK的专栏 893

COSMO-RS理论:流体相热力学预测的核心模型与技术突破

摘要:COSMO-RS模型通过量子化学计算分子表面电荷分布,实现了从微观量子尺度到宏观化工过程的热力学预测。该模型基于介电连续介质理论,将分子表面片段化处理,通过σ-剖面描述电荷分布,并计算片段间的静电失配能和氢键能。其核心算法通过自洽化学势方程求解活度系数,克服了传统模型依赖实验参数的局限。随着技术进步,模型引入了高阶描述符和色散力修正,提升了预测精度。在药物研发、化工分离等领域广泛应用,但仍存在对长程有序结构预测不足等局限性。该模型为复杂体系的热力学性质预测提供了重要理论工具。

ASKCOS博客 971

ARC简介以及工程中ARC与非ARC的混合(转)

ARC与非ARC在一个项目中同时使用,1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc 混用没有问题,没有用ARC的代码继续坚持谁申请谁释放就好了。以前的库没有时间重写,都采用这种方法。而且不知道你用...

weixin_30886233的博客 101

LinePhone3.2.7(android端最新版本) sip客户端

SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

上一篇: UIView 中的控件事件穿透 Passthrough 的实现
下一篇: iOS手势
focusjava
博客等级 码龄14年 127粉丝 528原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值