ARC机制
ARC概念及原理
1、了解指针分类
(1)强指针:默认的情况下,所有的指针都是强指针,关键字strong (2)弱指针:_ _weak关键字修饰的指针
声明一个弱指针如下:
_ _weak Person *p;
2、什么是ARC?
Automatic Reference Counting,自动引用计数,即ARC,可以说是WWDC2011和iOS5所引入 的最大的变革和最激动人心的变化。ARC是新的LLVM 3.0编译器的一项特性,使用ARC,可以说一 举解决了广大iOS开发者所憎恨的手动内存管理的麻烦。在工程中使用ARC非常简单:只需要像往常那样编写代码,retain,release autorelease~这是ARC的基本原则。
当ARC开启时,编译器将自动在代码合适的地方插入retain, releaseautorelease,而作为 开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)。
手动管理内存可以简称MRC (Manual Reference Counting)
ARC与其他语言的”垃圾回收”机制不同。ARC:编译器特性:“垃圾回收”运行时特性
只要某个对象被任一strong指针指向,那么它将不会被销毁
3、ARC工作原理及判断准则
ARC是Objective-C编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做的只不过是 在代码编译时为你自动在合适的位置插入release或autorelease,
ARC的判断准则: 只要没有强指针指向对象,对象就会被释放。
注意:当使用ARC的时候,暂时忘记“引用计数器”,因为判断标准变了
1)强指针 所有的指针默认就是强指针
强指针使用__strong 标识
2)弱指针 所有的指针默认就是强指针
弱指针使用__week 标识
ARC下循环引用问题
person.h
#import <Foundation/Foundation.h> @class Dog;
@interface Person : NSObject
//dog是strong 强指针
@property (nonatomic,strong) Dog *dog;
@end
person.m
#import <Foundation/Foundation.h>
@class Person;
@interface Dog : NSObject
//狗的主人 也是strong 强指针
@property (nonatomic,strong) Person *owner; @end
main.m
Person *p = [Person new]; Dog *d = [Dog new];

当p.dog = d后,仍然能够正常释放

当增加d.owner = p;时形成循环引用

造成循环引入
解决方案:
循环引入的对象中其中一个对象设置为strong 另一个设置为weak
ARC下@property参数
ARC中的@property
strong : 用于OC对象, 相当于MRC中的retain
weak : 用于OC对象, 相当于MRC中的assign
assign : 用于基本数据类型, 跟MRC中的assign一样
copy : 一般用于NSString, 跟MRC中的copy一样 在ARC情况下解决”循环retain”的问题:@property一边用strong,一边用weak
ARC使用特点及注意事项
1、ARC特点总结
(1)不允许调用release,retain,retainCount
(2)允许重写dealloc,但是不允许调用[super dealloc]
(3)@property的参数:
strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
weak:相当于原来的assign,(适用于oc对象类型),成员变量是弱指针 assign:适用于非OC对象类型(基础类型)
2、ARC使用注意事项
1)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空(赋值为nil)操作。
2)__weak Person *p=[[Person alloc] init];//不合理,对象一创建出来就被释放掉,对象释 放掉后,ARC把指针设置为nil。
3)ARC中在property处不再使用retain,而是使用strong,在dealloc中不需要再
[super dealloc]。
@property(nonatomic,strong)Dog *dog;
// 意味着生成的成员变量_dog是一个强指针,相当于以前的retain。
4)如果换成是弱指针,则换成weak,不需要加_ _。
(参考传智如意大师!)
ARC机制的更多相关文章
- 黑马程序员——ARC机制总结和用ARC建立模型
ARC 全称:Automatic Reference Counting 使用ARC 只需要在建立一个新的项目的时候把 下面的√打上 Xcode5以后都会默认建议开发者使用ARC机制 新的项目中如果有部 ...
- ARC机制集合内存管理
// // main.m // 13-ARC机制集合内存管理 // // Created by apple on 14-3-21. // Copyright (c) 2014年 apple. ...
- ARC机制下组合关系
// // Person.h // 01-autorelease基本概念 // // Created by apple on 14-3-18. // Copyright (c) 2014年 a ...
- [转]iOS ARC机制 weak strong
写在开头 虽然距离WWDC2011和iOS 5已经快一年时间,但是很多开发者并没有利用新方法来提高自己的水平,这点在ARC的使用上非常明显(特别是国内,基本很少见到同行转向ARC).我曾经询问过一些同 ...
- ARC机制之__strong具体解释
ARC机制之__strong具体解释 __strong 解析: 默认情况下,一个指针都会使用 __strong 属性,表明这是一个强引用.这意味着,仅仅要引用存在,对象就不能被销毁.这是一种所期望的 ...
- OC内存管理、非ARC机制、MRR机制
在Xcode里面,默认为ARC(auto reference counting),也就是自动内存管理机制,在这里我们要了解的是内存管理,肯定是不能让系统帮我们管理内存,我们需要将ARC关闭,首先在左边 ...
- iOS开发ARC机制下的内存管理技术要点
转载一篇: iOS开发ARC内存管理技术要点.ARC内存管理原则总结.iOS ARC内存管理总结 ARC内存管理机制 (一)ARC的判断准则: 只要没有任何一个强指针指向该对象,该对象就会被释放. ( ...
- 【iOS开发-34】自己主动释放池@autoreleasepool的使用注意事项以及ARC机制——面试必考内容
自己主动释放池@autorelease面试频率可能会吧release还要高. (1)在自己主动释放池@autoreleasepool{}中alloc一个对象后(如p1).仍然须要用[p1 autore ...
- ARC内存管理机制详解
ARC在OC里面个人感觉又是一个高大上的牛词,在前面Objective-C中的内存管理部分提到了ARC内存管理机制,ARC是Automatic Reference Counting---自动引用计数. ...
随机推荐
- SQL Server时间粒度系列----第2节日期、周时间粒度详解
本文目录列表: 1.从MySQL提供的TO_DAYS和FROM_DAYS这对函数说起2.SQL Server日期时间粒度3.SQL Server周有关时间粒度 4.总结语 5.参考清单列表 从My ...
- [Asp.net]通过uploadify将文件上传到B服务器的共享文件夹中
写在前面 客户有这样的一个需求,针对项目中文档共享的模块,客户提出如果用户上传特别的大,或者时间久了硬盘空间就会吃满,能不能将这些文件上传到其他的服务器?然后就稍微研究了下这方面的东西,上传到网络中的 ...
- Dapper学习 - Dapper.Rainbow(二) - Update/Delete
上一篇介绍了Rainbow的Create方法, 这里就来介绍一下Update方法吧, 毕竟新增和修改是双胞兄弟嘛. 一.Update 1. 测试代码: var conStr = Configurati ...
- DataTable转换为List<T>或者DataRow转换为T
这段时间开发ASP.NETMVC应用程序,从数据库获取数据之后,需要把记录转换为数据集在视图中显示.我们需要把DataTable转换为List<T>或者DataRow转换为T. 本篇中可以 ...
- C# 使用memcache(memcache安装)
1.下载memcache. 2.安装memcache. 3.安装好后,打开任务管理器就能看到memcache服务了. 4 .memcache基本命令.
- 孙鑫MFC学习笔记7:对话框编程(上)
1.DoModal创建模态对话框 2.Create创建非模态对话框(需要用ShowWindow显示出来) 模态:对话框显示,程序会暂停,直到对话框关闭 非模态:对话框显示,程序继续执行 3.对于模态对 ...
- Android提升篇系列:adb无法识别MX5等特殊机型
发现自己Ubuntu系统adb无法识别魅族 mx5机型.操作具体如下(其他机型依然适用): 一.Ubuntu环境 1.查看自己当前设备的idVendor lsusb命令直接查看当前usb设别列表,找到 ...
- EntityFramework动态多条件查询与Lambda表达式树
在常规的信息系统中, 我们有需要动态多条件查询的情况, 例如UI上有多个选择项可供用户选择多条件查询数据. 那么在.net平台Entity Framework下, 我们用Lambd ...
- sql2000安装的一般问题
SQLServer2000 在一段时间不使用后突然间不能够运行了.只能打开企业管理器,对数据库进行操作.VS2005不能够连接,试了很多种方式,无结果.于是重新安装 sqlServer2000? 仿真 ...
- Fiddler (五) Mac下使用Fiddler
Fiddler是用C#开发的. 所以Fiddler不能在Mac系统中运行. 没办法直接用Fiddler来截获MAC系统中的HTTP/HTTPS, Mac 用户怎么办呢? Fiddler可 ...