OC的内存管理(二)ARC
指针: 指向内存的地址
指针变量 存放地址的变量
指针变量值 变量中存放的值(地址值)
指针变量指向的内存单元值 内存地址指向的值
1):强指针:默认的情况下,所有的指针都是强指针,关键字strong
):弱指针:__weak关键字修饰的指针
声明一个弱指针的格式:
__weak Person *p;
ARC概念
Automatic Reference Counting,自动引用计数,即ARC,也可以说是WWDC2011和IOS5所引用的最大的变革和最激动人心的变化。ARC是新的LLVM3.0编译器的一项特性,使用ARC,可以说一举解决了广大IOS开发者所憎恨的手动管理内存的麻烦
2 在工程中使用ARC非常简单:只需要像往常那样编写代码,只不过永远不写retain,release和autorelesase三个关键字就可以~这是ARC的基本原则
3 在ARC开启时,编译器将自动在代码何时的地方插入retain,release 和autorelease,而作为开发者,完全不需要担心编译器会做错(除非开发者自己错用ARC了)
4 手动管理内存,可以简称MRC(Manual Reference Counting)
5 ARC与其他语言的"垃圾回收"机制不同,ARC:编译器特性:"垃圾回收"运行时特性
ARC的工作原理
ARC是Objective-C 编译器的特性,而不是运行时特性或者垃圾回收机制,ARC所做得只不过是在代码编译时为你自动在合适的位置插入release或autorelease
ARC的判断准则;
只要没有强指针引向对象,对象就会被释放
注意:当使用ARC的时候,暂时忘记"引用计数器",因为判断标准变了
如何判断当前是否处于ARC中?
.IOS5以后,创建项目默认的都是ARC
ALL ----leveles 检索 auto 可以看到 Objective-C Automatic Referece Counting 是否是 yes
.ARC机制下有几个明显的标志:
)不允许调用对象的release方法
)重写dealloc方法的时候,不能使用 [super dealloc];
)不允许调用autorelease方法
ARC下单对象内存管理
.在ARC下没有强指针引用是否会实时的立即被释放?
会,只要没有强指针引向,立刻马上的被释放掉
例:
Car *car =[[Car alloc]init];
//对象有没有被释放?
car=nil;
//会不会报错?
car.speed = ; ).会被释放,car被赋值为nil ,原来在堆区的空间没有强指针指向,内存空间会被释放
).不会报错---->为什么?
car.speed---->[car setSpeed:];
当car =nil;
[nil csetSpeed:] ;所以不会报错 //给nil发送任何消息都不会报错 .强弱指针
)强指针
所有的指针默认就是强指针
强指针使用__strong 标示
)弱指针
用__weak修饰的指针变量,都是弱指针
//car 强指针 car2弱指针 两者指向相同的内存空间
__weak Car *car2 = car;
car2 =nil;//不会是释放内存
ARC下多对象内存管理
ARC下循环引用的问题
如果是两个对象循环引入,那么只要将其中的一个设置为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特点总结
)不允许调用release,retain,retainCount
)可以重写dealloc,但是不允许调用[super dealloc];
)@property的参数
Strong:相当于原来的retain(适用于OC对象类型),成员变量是强指针
Weak:相当于原来的assign,(适用于OC对象类型),成员变量是弱指针
Assign:适用于非OC对象类型(基础类型)
ARC使用注意事项
)ARC中,只要弱指针指向的对象不在了,就直接把弱指针做清空操作
)__weak Person *p =[[Person alloc]init];//不可以,对象一创建出来就被释放掉了,对方释放后,ARC把指针自动清零
)ARC中的property处不再使用retain,而是使用strong,在dealloc中不需要在[super dealloc]
@perperty(nonatomic,strong)Dog *dog;
//意味着生成的成员变量_dog是一个强指针,相当于以前的retain
)如果换成是弱指针,则换成weak,不需要加__;
ARC模式下如何兼容非ARC的类
让程序兼容ARC和非ARC部分。
-转变为非ARC -fno-objc-arc
-转变为ARC的, -f-objc-arc
MRC 转换成ARC
转换之前记得先备份文件
OC的内存管理(二)ARC的更多相关文章
- 12.Object-C--浅谈OC的内存管理机制
昨天学习了OC的内存管理机制,今天想总结一下,所以接下来我要在这里bibi一下:OC的内存管理. 首先我要说的是,内存管理的作用范围. 内存管理的作用范围: 任何继承了NSObject的对象,对其他基 ...
- 黑马程序员——OC的内存管理学习小结
内存管理在Objective-C中的重要性就像指针在C语言中的重要程序一样. 虽然作为一门高级语言,但OC却没有内存回收机制.这就需要开发者来对动态内存进行管理.OC中内存管理的范围是:任何继承了NS ...
- OC:内存管理、dealloc方法、copy知识点
属性的声明:使⽤@property声明属性 例如:@property NSString *name: 相当于@interface中声明了两个⽅法(setter.getter): 属性的实现:使⽤@s ...
- OC的内存管理机制
总的来说OC有三种内存管理机制,下面将分别对这三种机制做简要的概述. 1.手动引用计数(Mannul Reference Counting-MRC) mannul:用手的,手工的. 引用计数:reta ...
- OC的内存管理(一)
在OC中当一个APP使用的内存超过20M,则系统会向该APP发送 Memory Warning消息,收到此消息后,需要回收一些不需要再继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会 ...
- OC基础 内存管理
OC基础 内存管理 我们所了解的c语言内存管理,如下: (1)c语言的内存分配:char *p = (char*)malloc(100*sizeof(char)); (2)c语言的内存释放:free ...
- OC 内存管理-02 ARC 内存管理
ARC 管理 概念: ARC简单,不用程序员在去管理内存 1.强指针 Strong[] :只要有强指针指向一个对象,那么系统就不会回收该对象 2.弱指针 weak :只要没有强指针指向对象,系统立即回 ...
- OC的内存管理
摘自:http://blog.csdn.net/hahahacff/article/details/39839571 OC内存管理 一.基本原理 (一)为什么要进行内存管理. 由于移动设备的内存极其有 ...
- 内存管理、ARC
内存管理 一.基本原理 1.什么是内存管理 移动设备的内存极其有限,每个app所能占用的内存是有限制的 当app所占用的内存较多时,系统会发出内存警告,这时得回收一些不需要再使用的内存空间.比如回收一 ...
随机推荐
- 老司机实战Windows Server Docker:3 单节点Windows Docker服务器简单运维(上)
经过上两篇实战Windows Server Docker系列文章,大家对安装Windows Docker服务以及如何打包现有IIS应用为docker镜像已经有了基本认识.接下来我们来简单讲讲一些最基本 ...
- cstring头文件函数解析
原创作品,转载请注明来源:http://www.cnblogs.com/shrimp-can/p/5643829.html 在使用由字符数组或指针组成的字符串的时候,要用到一些函数,这些函数通常包含在 ...
- Dreamweaver如何开启代码错误提示,报错代码。
DW的代码错误即无效提示功能设置:在DW代码窗口左面有一列很小的功能按钮,在其中寻找"高亮显示无效代码",选中之后就可以看到无效的代码会被添加背景色,会让你容易辨识.改正后背景色会 ...
- iOS开发之Segue
Storyboard上每一根用来界面跳转的线,都是一个UIStoryboardSegue对象(简称Segue). 每一个Segue对象,都有3个属性: (1)唯一标识 @property (nonat ...
- 浅谈MVC缓存
缓存是将信息放在内存中以避免频繁访问数据库从数据库中提取数据,在系统优化过程中,缓存是比较普遍的优化做法和见效比较快的做法. 对于MVC有Control缓存和Action缓存. 一.Control缓存 ...
- js中实现继承的几种方式
首先我们了解,js中的继承是主要是由原型链实现的.那么什么是原型链呢? 由于每个实例中都有一个指向原型对象的指针,如果一个对象的原型对象,是另一个构造函数的实例,这个对象的原型对象就会指向另一个对象的 ...
- 转:Java中finally和return的执行关系
finally可以分两方面理解 1.执行时机问题.finally总会执行(除非是System.exit()),正常情况下在try后执行,抛异常时在catche后面执行 2.返回值问题.可以认为try( ...
- 【C++】智能指针详解(一):智能指针的引入
智能指针是C++中一种利用RAII机制(后面解释),通过对象来管理指针的一种方式. 在C++中,动态开辟的内存需要我们自己去维护,在出函数作用域或程序异常退出之前,我们必须手动释放掉它,否则的话就会引 ...
- POJ3592 Instantaneous Transference题解
题意: 给一个矩形,矩形中某些点有一定数量的矿石,有些点为传送点,有些点为障碍.你驾驶采矿车(ore-miner truck,我也不知道是什么),从左上角出发,采尽量多的矿石,矿石不可再生.不能往左边 ...
- 学习MVC之租房网站(三)-编写实体类并创建数据库
在上一篇<学习MVC之租房网站(二)-框架搭建及准备工作>中,搭建好了项目框架,并配置了EF.Log4Net和进程外Session.接下来会编写Eneity类并采用CodeFirst的方式 ...