黑马程序员--IOS学习日记:07--内存管理之引用计数器
来源:互联网 发布:棉花期货天狼星软件 编辑:程序博客网 时间:2024/04/30 07:58
------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
一、内存管理
内存管理关心的是清理(回收)不用的内存,以便能够再次利用。如果一个对象不再使用,就需要释放对象占用的内存。这听起来简单。然而,事实上并不是那么简单。为了能够进行内存管理,人们已经开发出多种内存管理策略。在Xcode 4.2 发布以前,程序员需要细致处理引用计数,使用保留(retain)、释放(release)和自动释放(autorelease),才能让开发的应用能够明智地处理内存使用,并且在大多数时候不会崩溃。但结果常常导致试图去引用的对象已经在无意间销毁了。 Xcode 4.2 版本发布以后,有一个新特性是自动引用计数(Automatic Reference Counting, ARC),程序员不再思考内存管理方面的问题。但为了方便开发,我们应该熟悉内存管理的策略。
提供给OC程序员的基本内存管理模型有以下三种:
1>自动垃圾收集
2>手工引用计数和自动释放池
3>自动引用计数(ARC)
内存管理的范围:任何继承了NSObject的对象,对其他数据类型(int、char、float、double、struct、enum等)无效
二、引用计数器
1. 每个OC对象都有自己的引用计数器,是一个整数,表示“对象被引用的次数”,即有多少人正在使用这个OC对象
2. 每个OC对象内部专门有4个字节的存储空间来存储引用计数器
3. 引用计数器的作用
1>当使用alloc、new或者copy创建一个新对象时,新对象的引用计数器默认就是1
当一个对象的引用计数器值为0时,对象占用的内存就会被系统回收。换句话说,如果对象的计数器不为0,那么 在整个程序运行过程,它占用的内存就不可能被回收,除非整个程序已经退出
4.引用计数器的操作
1>给对象发送一条retain消息,可以使引用计数器值+1(retain方法返回对象本身)
2>给对象发送一条release消息,可以使引用计数器值-1
3>可以给对象发送retainCount消息获得当前的引用计数器值
5.对象的销毁
1>当一个对象的引用计数器值为0时,那么它将被销毁,其占用的内存被系统回收
2>当一个对象被销毁时,系统会自动向对象发送一条dealloc消息
3>一般会重写dealloc方法,在这里释放相关资源,dealloc就像对象的遗言
4>一旦重写了dealloc方法,就必须调用[super dealloc],并且放在最后面调用
5>不要直接调用dealloc方法
6>一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
三、方法的基本使用
1.方法的基本使用
1> retain :计数器+1,会返回对象本身
2> release :计数器-1,没有返回值
3> retainCount :获取当前的计数器
4> dealloc
* 当一个对象要被回收的时候,就会调用
* 一定要调用[super dealloc],这句调用要放在最后面
2.概念
1> 僵尸对象 :所占用内存已经被回收的对象,僵尸对象不能再使用
2> 野指针 :指向僵尸对象(不可用内存)的指针,给野指针发送消息会报错(EXC_BAD_ACCESS)
3> 空指针 :没有指向任何东西的指针(存储的东西是nil、NULL、0),给空指针发送消息不会报错
实例:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @end
#import "Person.h" @implementation Person // 当一个Person对象被回收的时候,就会自动调用这个方法 - (void)dealloc { NSLog(@"Person对象被回收"); // super的dealloc一定要调用,而且放在最后面 [super dealloc]; } @end
int main() { // 1 Person *p = [[Person alloc] init]; // 2 retain方法返回的是对象本身 [p retain]; // 1 [p release]; // 0 野指针:指向僵尸对象(不可用内存)的指针 [p release]; [p retain]; // -[Person setAge:]: message sent to deallocated instance 0x100109a10 // 给已经释放的对象发送了一条-setAge:消息: p.age = 10; //[p setAge:10]; // 指针p变成空指针 //p = nil; // EXC_BAD_ACCESS : 访问了一块坏的内存(已经被回收、已经不可用的内存 // 野指针错误 // OC不存在空指针错误,给空指针发送消息,不报错 [p release]; [p release]; [p release]; [p release]; [nil release]; return 0; }
- 黑马程序员--IOS学习日记:07--内存管理之引用计数器
- 黑马程序员---内存管理之引用计数器
- 黑马程序员_object c学习日记③_SEL数据、内存管理一:引用计数器、retain、release、dealloc等
- 黑马程序员--IOS学习日记:08--内存管理之set方法的内存管理
- 黑马程序员-iOS学习日记(八)内存管理
- 黑马程序员--IOS学习日记:10--内存管理之ARC机制
- 黑马视频学习笔记-内存管理-引用计数器
- 内存管理之引用计数器
- IOS学习第二篇 ——引用计数器内存管理
- iOS 基本内存管理-引用计数器
- iOS 内存管理~深浅拷贝~引用计数器
- 黑马程序员——Objective-C程序设计(第4版)学习笔记之17-内存管理和自动引用计数——黑马 IOS 技术博客
- 黑马程序员——OC基础---内存管理(引用计数器,多对象内存管理,set方法的内存管理,模型设计,循环引用)
- 黑马程序员--ios内存管理
- 黑马程序员_引用计数器
- 黑马程序员- IOS学习笔记-OC内存管理学习
- iOS开发---内存管理/引用计数器1--引用计数器思考方式
- 黑马程序员之ios学习总结——11 OC语言的内存管理1
- android开发之应用打包签名混淆流程
- 简易文本编辑器
- Ubuntu14.04下配置SSH以支持远程putty登录
- POJ 2888 Magic Bracelet(ploya)
- POJ 2480 Longge's problem (欧拉函数+乘性函数)
- 黑马程序员--IOS学习日记:07--内存管理之引用计数器
- sql批量更新
- 简要理解数据库
- 各种排序算法的分析及java实现
- 新闻发布系统(上)———初步学习前后台
- 手动ghost 还原系统到C盘步骤总结
- C#访问sqllite数据库的数据库访问类
- [黑马程序员]7 JAVA基础- 集合
- HashMap源码解析