ARC————自动引用计数
一。内存管理/引用计数
1.引用计数式内存管理的方式(下面四种)
对象操作 OC方法
生成并持有对象 alloc/new/copy/mutableCopyd等方法
持有对象 retain方法
释放对象 release方法
废弃对象 dealloc方法
这些有关内存管理的方法,实际上不包括在该语言中,而是包含在Cocoa框架中用于OS X,IOS应用开发。
Cocoa框架中的Foundation框架库的NSObject类担负内存管理的职责。
OC内存管理中的alloc、retain、release、dealloc方法分别指代NSObject类的alloc类方法、retain实例方法、release实例方法和dealloc实例方法。
a。自己生成的对象,自己持有。
aa。使用以下名称开头的方法名意味着自己生成的对象只有自己持有:alloc、new、copy、mutableCopy。
ab。[[NSObject alloc] init] = [NSObject new];
ac。copy方法利用基于NSCopying方法约定,由各类实现的copyWithZone:方法生成并持有对象的副本。
ad。mutableCopy方法里利用基于NSMutableCopying方法约定,由各类实现的mutableCopyWithZone:方法生成并持有对象的副本。
b。非自己持有的对象,自己也能持有。
id obj = [NSMutableArray array];
[obj retain];
通过retain方法,非自己持有的对象跟用上述方法生成并持有的对象一样,成为了自己所持有的方法。
c。不再需要自己持有的对象时释放
ca。自己持有的对象,一旦不再需要,持有者有义务释放该对象。释放用release方法。
cb。自己生成而非自己所持有的对象,若用retain方法变为自己持有,也同样可以用release方法释放。
d。无法释放非自己持有的对象
2.alloc/retain/release/dealloc实现
在OC的对象中存有引用计数这一整数值。
调用alloc或是retain方法后,引用计数值加1.
调用release后,引用计数值减1.
引用计数值为0时,调用dealloc方法废弃对象。
3.苹果的实现
4.autorelease及其实现
autorelease的具体使用方法:
a。生成并持有对象的NSAutoreleasePool对象。
b。调用已分配对象的autorelease实例方法。
c。废弃NSAutoreleasePool方法。
********************************
二。ARC规则
1.概要
设置ARC有效的编译方法:
使用clang(LLVM编译器)3.0或以上版本。
指定编译器属性为“-fobjc-arc”。
2.内存管理的思考方式
和上面的一样。
3.所有权修饰符
a。OC编程中为了处理对象,可将变量类型定义为id类型或各种对象类型。
id类型用于隐藏对象类型的类名部分,相当于C语言中常用的“void *”。
对象类型就是指向NSObject这样的OC类的指针,如“NSObject *”。
b。ARC有效时,id类型和对象类型同C语言其他类型不同,其类型上必须附加所有权修饰符。所有权修饰符有四种: _strong/_weak/_unsafe_unretained/_autoreleasing。
c。_strong修饰符
ca。_strong修饰符是id类型和对象类型默认的所有权修饰符。
cb。_strong修饰符表示对对象的“强引用”。持有强引用的变量在超出其作用域时被废弃,随着强引用的失效,引用的对象会随之释放。
cd。附有_strong修饰符的变量之间可以相互赋值。
ce。在OC类成员变量和方法参数上,都可以使用_strong修饰符。
cf。_strong修饰符和_weak/_autoreleasing修饰符一起,可以保证将附有这些修饰符的自动变量初始化为nil。
如:id _strong obj0; == id _strong obj0 = nil;
d._weak修饰符
da。使用_strong修饰符的成员变量在持有对象时,很容易发生循环引用。
db。循环引用容易发生内存泄露。内存泄露就是应当废弃的对象在超出其生存周期后继续存在。
dc。使用_weak修饰符可以避免循环引用。
dd、_weak修饰符还有另一有优点。在持有某对象的弱引用时,若该对象被废弃,则此弱引用将自动失效且处于nil被赋值的状态(空弱引用)。
de。综上,使用_weak修饰符可避免循环引用。通过检查附有_weak修饰符的变量是否为nil,可以判断被赋值的对象是否已废弃。
df。但是,_weak修饰符只能用于ios5以上以及OS X Lion以上版本的应用程序。在ios4以及OS X Snow Leopard的应用程序中可使用_unsafe_unretained修饰符来代替。
e。_unsafe_unretained修饰符
f。_autoreleasing修饰符
fa。ARC有效时autorelease方法不能使用,也不能使用NSAutoreleasePool类。但是,autorelease功能是起作用的。
fb.id的指针或对象的指针在没有显式指定时会被附上_autoreleasing修饰符。
fc。为了得到错误的详细信息,经常会在方法的参数中传递NSError对象的指针,而不是函数返回值。
4.规则
a。不能使用retain、release、retainCount、autorelease。
a1。内存管理是编译器的工作,因此没有必要使用内存管理的方法(retain、release、retainCount、autorelease)。
a2。不能使用NSAllocateObject、NSDeallocateObject。
a3。续遵守内存管理的方法命名规则
a4。不要显示调用dealloc。
a5。使用@autorelease块替代NSAutoreleasePool。
a6。不能使用区域(NSZone)。
a7。对象型变量不能作为C语言结构体的变量。
a8.显示转换id和void*。
5.属性
a。当ARC有效时,OC类的属性也会发生变化
b。属性声明的属性与所有权修饰符的对应关系:
assign ———— _unsafe_unretained
copy ———— _strong
retain ———— _strong
strong ———— _strong
unsafe_unretained ———— _unsafe_unretained
以上各种属性赋值给指定的属性中就相当于赋值给附加各属性对应的所有权修饰符的变量中。
其中,只有copy属性不是简单的赋值,它赋值的是通过NSCopying接口的copyWithZone:方法复制赋值源所生成的对象。
**************************
三。ARC的实现
ARC是“由编译器进行内存管理”的,但实际上只有编译器是无法完全胜任的,在此基础上还需要OC运行时库的协助。也就是说,ARC由以下工具、库来实现:
clang(LLVM编译器)3.0以上
objc4 Objective-C运行时库493.9以上。
ARC————自动引用计数的更多相关文章
- obj-c编程11:内存管理和ARC(自动引用计数)
乖乖隆地洞,这篇文章内容可是不得了,内存管理哦!首先,这个要是搞不明白,你就等着进程莫名其妙的挂死,或是疯狂申请内存却不释放,结果被OS杀死,不管是"自杀"还是"他杀&q ...
- Swift ARC 自动引用计数
1.ARC 引用类型在堆上的内存分配过程中有 8 字节的地址长度用来保存对象的引用计数,堆上的内存并不像栈上那样立即进行回收,系统会定时对堆上的内存进行检查,当某个实例不再被使用时,引用计数会变为 0 ...
- swift:自动引用计数ARC
Swift自动引用计数:ARC 原文链接:https://numbbbbb.gitbooks.io/-the-swift-programming-language-/content/chapte ...
- 自动引用计数(ARC)
1.1什么是自动引用技术 顾名思义,自动引用计数(ARC, Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术.以下摘自苹果官方说明: 在Objectiv ...
- Swift5 语言指南(二十五) 自动引用计数(ARC)
Swift使用自动引用计数(ARC)来跟踪和管理应用程序的内存使用情况.在大多数情况下,这意味着内存管理在Swift中“正常工作”,您不需要自己考虑内存管理.当不再需要这些实例时,ARC会自动释放类实 ...
- OC - ARC(自动引用计数)
1.什么是自动引用计数? 顾明思义,自动引用计数(ARC,Automatic Reference Counting)是指内存管理中对引用采取自动计数的技术. 在OC中采用ARC机制,让编译器来进行内存 ...
- Swift 自动引用计数(ARC)
Swift 使用自动引用计数(ARC)这一机制来跟踪和管理应用程序的内存 通常情况下我们不需要去手动释放内存,因为 ARC 会在类的实例不再被使用时,自动释放其占用的内存. 但在有些时候我们还是需要在 ...
- swift学习笔记5——其它部分(自动引用计数、错误处理、泛型...)
之前学习swift时的个人笔记,根据github:the-swift-programming-language-in-chinese学习.总结,将重要的内容提取,加以理解后整理为学习笔记,方便以后查询 ...
- Swift2.1 语法指南——自动引用计数
原档: https://developer.apple.com/library/prerelease/ios/documentation/Swift/Conceptual/Swift_Programm ...
随机推荐
- Citrix 服务器虚拟化之五 Xenserver配置存储
Citrix 服务器虚拟化之五 Xenserver配置存储 XenServer中定义了一个容器称为存储库(SR)来描述一个特定的存储目标存储虚拟磁盘映像(VDI). VDI是一个的磁盘抽象,包含一个 ...
- CSS从大图中抠取小图完整教程(background-position应用)
CSS从大图中抠取小图完整教程(background-position应用) 转自: http://www.cnblogs.com/iyangyuan/archive/2013/06/01/3111 ...
- 日志挖掘Logmnr
日志挖掘 9.1 日志中数据用途 所有对用户数据以及数据字典的改变全部被保存在联机日志中.当然nologging,insert/*+append+/情况比较特殊除外,因此归档日志可以用来做数据库的恢复 ...
- JQuery 插件FlexiGrid 之完全配置与使用
博客分类: Java综合 jQuery配置管理jsonServlet数据结构 自己再做这个的时候.也是找了很多资料..但网上搜索了很多资料. 没有介绍的很全的. 鄙人就在此献丑一下. 来全面的介绍一 ...
- AM3359之U-boot及kernel编译
我用的PC主机是ubuntu12.04 LST 32位系统给出官方软件下载地址:TI官网SDK包06.00版本下载:http://software-dl.ti.com/sitara_linux/esd ...
- LoadRunner界面分析(三)
1.Anaysis基础知识 2.Analysis 报告 3.Analysis分析基础 4.IP欺骗 需要使用ip欺骗的原因:1.当某个IP的访问过于频繁,或者访问量过大是,服务器会拒绝访问请求,这时候 ...
- svn 常用操作命令
svn 常用操作命令 检出 svn checkout http://路径(目录或文件的全路径) [本地目录全路径] --username 用户名 svn checkout svn://路径(目录或文件 ...
- ASP.NET 5 之 错误诊断和它的中间件们
ASP.NET5包含若干个新的功能来辅助诊断错误,可以在Startup类中简单的为应用程序错误配置不同的处理程序或者显示关于应用程序的附加信息. 配置错误处理页面 在ASP.NET5中,在Startu ...
- 博客中 Flex4/Flash mp3音乐播放器实例 含演示地址
要求 必备知识 本文要求基本了解 Adobe Flex编程知识和JAVA基础知识. 开发环境 MyEclipse10/Flash Builder4.6/Flash Player11及以上 演示地址 演 ...
- robotframework+ride+Selenium2Library+AutoItLibrary配置
最近要安装RFS,虽然网上很多安装说明,但是自己装的时候还是遇到了很多问题. 1. AutoLibrary导入失败:猜测原因是AutoLibrary需要先安装pywin32,而我一开始安装的是pyth ...