ARC简介

1、简介:
ARC(Automatic Reference Counting),自动引用计数,需要XCode4.2和SDK5.0的支持。它是一个在编译期间工作的技术,编译器在编译的时候会根据变量的作用域为objective-c变量添加合适的retain、release、autorelease等函数。原先需要手动添加的用来处理内存管理的引用计数的代码可以自动地由编译器完成。

2、设置XCode为ARC项目:在BuildSettings里面,名为"Objective-C Automatic Reference Counting"的键值,表示此Target是否使用ARC。值类型为BOOL值。

3、ARC的一些规则:
(1).不能调用如下函数(包含隐式调用):retain、release、retainCount、autorelease。
(2).不能调用dealloc。XCode会自动生成delloc方法,不能自己实现,但是如果必须要实现,不能调用[super dealloc]。
(3).不能使用NSAllocateObject和NSDeallocateObjdect。
(4).不能使用自动释放池:NSAutoreleasePool。作为替代,使用@autoreleasepool{ ... }。
(5).不能在c语言结构中使用objective-c指针。
(6).禁止以new开头命名的属性变量。

4、ARC的一个基本规则:只要一个对象被任一strong类型的指针指向,那么它将不会被销毁。如果对象没有被任何strong类型的指针指向,它将被销毁。

5、strong关键字:指向对象,并且持有它;weak关键字:指向对象,但并不持有它;

6、当一个对象不被持有时,它将被销毁,并且所有指向这个对象的weak指针都将被置为nil,从而避免了EXE_BAD_ACCESS这个错误。

7、默认情况下,所有全局变量和局部变量都是strong类型的。

8、release方法的自动添加,是根据变量的作用域来定的。如果是局部变量,方法执行完毕,局部变量就释放了;如果是全局变量,持有此全局变量的对象释放了,全局变量也就释放了。虽然不用再调用retain、release,但是并不是就什么都不做了。在某些情况下,我们仍然需要在合适的地方把strong类型的指针置为nil,否则App会很可能发生内存溢出(延迟释放、 内存警告),比如单例或者一直存在的对象持有的时有时无的Strong类型的变量。

9、当我们只用一些非ARC项目的代码库时,可以设置编译flag,使这些代码不使用ARC编译。从而实现ARC和非ARC的代码混编。flag值:-fno-objc-arc。在Build Phases->Compile Sources中,可以给每一个文件添加此编译值。

10、使用ARC时,strong、weak、autoreleasing类型的变量,会被初始化为nil,打印时会提示”null“,不会crash。

11、property关键字中加入了strong、weak、unsafe_unretained类型。在ARC中,这些类型可以和retain、copy、assign混用,但是出于规则,最好使用新加入的。

12、property类型使用总结(ARC):
(1)strong和retain比较类似,strong关键字对应__strong类型的变量,它将持有所指向的对象。
(2)weak关键字对应__weak类型的变量。weak不持有所指向的对象,而且当所持有的对象销毁时,会将自己置为nil。delegate和outlet都应该用weak来声明。
(3)unsafe_unretained就是assign,在ARC环境中,大部分assign应该都应该被weak代替。但是一些基本类型还是要用assign,比如int、float、bool等。
(4)copy:copy一个对象,并且为其创建一个strong类型的指针。

13、ARC需要SDK5.0的支持,但是Deployment Target最低可以从iOS4开始。weak关键字是iOS5中新加入的,在iOS4中使用unsafe_unretained代替,但是当对象销毁时,它修饰的变量不会被置nil,需要自己手动维护。同样,在iOS4中,输出口用strong代替,在dealloc方法中置nil。

14、置空总结:
(1)strong,retain,copy产生的都是__strong类型的变量,在某些情况下,需要手动置空,第8点有提。
(2)weak类型不会产生野指针,因为当对象销毁时,它会被置nil,所以不用手动维护。
(3)针对objective-c变量,assign产生__unsafe__unretained类型的变量,和unsafe_unretained一样,这些变量在对象销毁时不会被置nil,要自己处理野指针。
(4)针对基本类型,使用assign,没有引用计数。
(5)要延迟释放,使用__autoreleasing关键字。

15.ARC只针对Objective-C的代码。像Core Foundation样式的代码,必须自己调用CFRetain和CGRelease,自己管理内存。当在Objective-C和Core Foundation代码对象类型相互转换时,需要告知编译器由谁来控制释放,方法如下:
(1)__bridge关键字,转换指针类型时不改变控制者;
(2)__bridge__retained或者CFBridgeRetain,把Objective-C类型转换成非Objective-C类型的时候用,然后由非Objective-C代码手动释放。
(3)__bridge__transfer或者CFBridgeRelease,将非Objective-C类型转换成Objective-C类型时用,然后由ARC控制释放。

16、在ARC中防止strong指针循环引用:
(1).如果A和B需要相互引用,则A对B使用strong,B对A使用weak。
(2).ARC在block中的使用:
   在手动管理模式下,对block外部变量使用__block,则变量不会被retain;但是在ARC模式下,变量会仍然会被retain。解决办法如下:使用__weak关键字代替__block关键字。因为ARC不会为__weak指针retain。
(3)可以让循环引用的情况存在,但是在想让循环引用消失的时候,必须有合适的机制能够打破循环引用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/500131.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微信验证码无法连接到服务器,微信无法连接到服务器1237解决方法

太多朋友在使用微信过程中出现微信无法连接到服务器1237的问题,出现这个问题的原因有很多种,接下来小编带大家找出问题原因,然后成功解决这个问题。以下是网友们成功解决此问题的方法,大家可以参考一下方法一:首先重启…

iOS后台任务

一、概览1.从iOS4.0开始,系统添加了多任务特征,允许应用在按下Home键之后,继续执行后台任务。大部分应用在进入后台之后就进入了挂起状态,只有那些为用户提供重要服务的App能够在进入后台之后继续运行一段时间。2.一般情况下&…

王者荣耀服务器维护bug,8月23日王者荣耀ios版更新一直显示维护是什么情况?更新出现bug 附处理方法...

相信很多喜爱玩王者荣耀的游戏玩家可以知道今天是王者荣耀星计划更新的日子,但是有很多苹果手机的小伙伴出现了一个问题,那就是无法进入游戏,甚至是更新十分的缓慢,在这里本文为您带来最新的解决方法!苹果手机微信区一…

服务器任务栏不显示程序,Win10任务栏不显示应用程序标签怎么办?

Win10任务栏不显示应用程序标签怎么办?执拗的人才会一条路走到黑,多个朋友多条路,多个方法多种选择。关于Win10任务栏不显示应用程序标签,一般是explorer进程出现故障导致,哦!忘记说了Win10系统下这东东改了个好听的名字&#xf…

Objective-C复制解析

一、为什么使用复制?1.C语言以及Objective-C语言总是按值传递的,按值传递意味着是隐式复制。在这里就分为两种情况:(1)如果是非对象类型,对传递过来的值进行更改,只会更改副本,对原始值没有影响&#xff0c…

udp协议的服务器是哪种类型,UDP协议

UDP协议1.UDP使用场景域名系统若是执行时间内,没有响应返回,证明包已丢失。音频或视频数据包的丢失只会造成通话或视频的干扰和不清楚,而不会像TCP协议那样造成通话的丢失或卡顿。2.UDP和TCP的类比UDP类似于邮局,数据的接受与否和…

归档和解档-Archiver

一、概念1.归档用于保存对象,包括被归档对象之间的各种相互关系或者依赖性。解档用于重建以前归档的对象与关系。在其它面向对象的语言中,一般使用术语"序列化"来描述归档解档模式。2.归档的对象通常存储为二进制数据,可以在内存或…

碧雪情天服务器地址源如何修改,稀有游戏《碧雪情天online》网络版王者归来一键服务端+客户端 支持转生系统和新图...

碧雪情天online王者归来版本介绍:1.增加新的职业套装;2.增加高川台、雪域、魔灵和天庭等新图;3.仙侠岭先知处添加角色转生功能;4.碣石村宝官添加装备签名和祝福卡兑换角色经验功能;5.增加宠物经验兑换角色经验功能;6.其它新内容和…

Objective-C单例

一、要点:1.当在应用程序中只需要有类的一个实例,并且可以被其它对象轻松的访问的时候,可以使用单例类。2.首先需要声明一个静态的类的实例变量,并初始化为nil。应该将该实例变量声明在类的实现文件中,表示变量仅在该实…

刚买的ubuntu服务器 为什么没有文件,新买的linux服务器怎么使用

新买的linux服务器怎么使用 内容精选换一换切换操作系统是为您的弹性云服务器重新切换一个系统盘。切换完成后弹性云服务器的系统盘ID会发生改变,并删除原有系统盘。如果弹性云服务器当前使用的操作系统不能满足业务需求(如软件要求的操作系统版本较高),…

iOS应用横竖屏切换

一、概述: 在iOS应用中,由UIViewController来控制屏幕翻转,根据需要随设备方向自动切换。在iOS6和之前的系统之间,控制方法发生了些变化。二、视图伸缩属性:1.UIView类的autoresizingMask属性,用来指定当它…

iOS简单动画实现方案

一、仿射变换--CGAffineTransform1.仿射变换,一种基于二维坐标的转换功能。CGAffineTransform数据结构代表一个二维坐标系的转换矩阵。2.通过CGAffineTransform数据结构,可以构造二维坐标系内的平移、伸缩、旋转矩阵。详情可以参看苹果开发文档中关于该数…

三维转换矩阵解释

一、图解 二、单位矩阵{1.0f,0.0f,0.0f,0.0f;0.0f,1.0f,0.0f,0.0f;0.0f,0.0f,1.0f,0.0f;0.0f,0.0f,0.0f,1.0f;}

Objective-C文件流操作

一、NSFileHandle1.它能够以流的方式访问基于文件、网络、管道、设备的数据,可以设置写入的位置指针。2.NSData、NSString写入文件的方法是直接覆盖写入,全部读出,当处理大数据的文件时,对内存会造成压力。而NSFileHandle能够以流…

CoreAnimation编程指南(简介)

一、核心动画编程介绍1.本文档介绍了在使用核心动画时所涉及的基本概念。核心动画的是Objective – C的框架,它通过简单的动画编程接口来提供一套高性能的动画引擎。2.你应该阅读此文档来理解Cocoa应用程序核心动画工作的机制。 阅读此文档的前提是你已经掌握了Obje…

CoreAnimation编程指南(一)概念

一、概述1.核心动画是一套包含图形绘制,投影,动画的Objective–C类集合。它通过开发人员所熟悉的应用程序套件和Cocoa Touch视图架构的抽象分层模式,同时使用先进的合作效果提供了一套流畅的动画。2.动态的动画接口很难创建,但是核…

python实现常见排序算法

python实现常见排序算法 快速排序 思想&#xff1a;取出第一个元素把它放到序列的中间某一个正确位置&#xff0c;以它进行分割成左边和右边&#xff0c;再分别对左边和右边进行取元素分割&#xff08;递归&#xff09; 递归实现 def quicksort(array):if len(array) < …

CoreAnimation编程指南(二)渲染架构

1.虽然核心动画的图层和Cocoa的视图在很大程度上没有一定的相似性&#xff0c;但是他们两者最大的区别是&#xff0c;图层不会直接渲染到屏幕上。2.在模型-视图-控制器&#xff08;model-view-controller&#xff09;概念里面NSView和UIView是典型的视图部分&#xff0c;但是在…

学习递归

算法之递归 递归思想 递归就是函数自己调用自己&#xff0c;会使代码逻辑很清晰&#xff0c;但是Stack Overflow上有说的一句话&#xff1a;“如果使用循环&#xff0c;程序的性能可能更高&#xff1b;如果使用递归&#xff0c;程序可能更容易理解。如何选择要看什么对你来说…

CoreAnimation编程指南(三)几何变换

本章介绍图层的几何组成部分&#xff0c;及他们之间的相互关&#xff0c;同时介绍如何变换矩阵可以产生复杂的视觉效果。一、图层的坐标系1.图层的坐标系在不同平台上面具有差异性。在iOS系统中&#xff0c;默认的坐标系统原点在图层的中心左上角地方&#xff0c;原点向右和向下…