黑马程序员--学习OC加强内存管理
来源:互联网 发布:aes算法加密过程 编辑:程序博客网 时间:2024/05/29 09:20
内存管理的基本概念及范围
1、OC内存管理的原理
1)对象的所有权及引用计数
对象所有权概念
任何对象都可能拥有一个或者多个所有者。只要一个对象至少还有一个所有者,他就会继续存在。
Cocoa所有权策略
任何自己创建的对象都归自己所有,可以使用“alloc”或“new”开头或名字中包含“copy”的对象方法创建对象,可以使用retain来获得一个对象的所有权。
2)对象引用计数器
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数,即现在有多少个东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器的值变为0时,则对象销毁。
对象的结构:

每个OC对象内部,都专门有8个字节的存储空间来存储引用计数器。
3)引用计数器的作用
判断对象要不要回收的唯一依据(存在一种例外:对象值为nil时,引用计数为0,但不回收 空间)就是计数器是否为0,若不为0则存在。
4) 对引用计数器的操作
给对象发送消息,进行相应的计数器操作。
retain消息:使计数器+1,该方法返回对象本身
release消息:使计数器-1(并不代表释放对象)
retainCount消息:获得对象当前的引用计数器值 %ld %tu
5) 对象的销毁
当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。
当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这 里释放相关的资源,dealloc就像是对象的“临终遗言”。
一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直 接调用dealloc方法)。
一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指 针错误)。
2、OC内存管理分类
OC提供了三种内存管理方式
1)MRC 手动管理
2)ARC 自动引用计数
3)garbage collection iOS不支持垃圾回收
3、单个对象的野指针问题
避免使用僵尸对象的方法是,对象释放后给对象赋值nil;
单个内存泄露问题
//单个内存泄露问题 //内存泄露情况1 //创建完成后没有release Dog *dog=[Dog new]; //内存泄露问题2 //没有遵守内存管理原则 [dog retain]; [dog release]; //不当的是用nil Dog *dog=[Dog new]; dog=nil; [dog eat];
4、多个对象内存管理
set 方法的内存管理
1)基本数据类型
int float double long struct enum -(void)setAge:(int)age{ _age=age; }
2)OC对象类型
-(void)setCar:(Car*)car{//先判断是不是新传进来的对象 if (car!=_car) { //对旧对象做一次release [_car release]; //对新对象做一次retain _car=[car retain]; }}
5、@property参数
格式:@property (参数1,参数2) 数据类型 方法名

内存管理相关参数
retain:对对象release旧值,retain新值(适用于OC对象类型)
assign:直接赋值(默认,适用于非oc对象类型)
copy:release旧值,copy新值
6、@class
作用:在.h文件中使用@class引用一个类,在.m中使用#import包含这个类的.h文件
@class和@import的区别:
作用上的区别
#import会包含引用类的所有信息(内容), 包括引用类的变量和方法
@class仅仅是告诉编译器有这么一个类, 具体这个类里有什么信息, 完全不知
效率上的区别
如果有上百个头文件都#import了同一个文件,或者这些文件依次被#import,那么一旦最开始的头 文件稍有改动,后面引用到这个文件的所有类都需要重新编译一遍 , 编译效率非常低 相对来讲,使用@class方式就不会出现这种问题了
- 黑马程序员--学习OC加强内存管理
- 黑马程序员——oc加强学习(内存管理)
- 黑马程序员----oc加强笔记----内存管理
- 黑马程序员-OC加强回顾-内存管理
- 黑马程序员-OC加强-内存管理
- 黑马程序员—IOS加强视频—oc内存管理
- 黑马程序员 OC------内存管理学习
- 黑马程序员-OC学习笔记-----内存管理
- 黑马程序员-OC-内存管理
- 黑马程序员--oc:内存管理
- [黑马程序员][OC]内存管理
- 黑马程序员-OC内存管理
- 黑马程序员---OC--内存管理
- 黑马程序员---oc 内存管理
- 黑马程序员-OC-内存管理
- 黑马程序员-OC内存管理
- 黑马程序员- IOS学习笔记-OC内存管理学习
- 黑马程序员——OC语言加强---内存管理的基本概念及范围
- 九度oj 1335
- C - Valera and Contest题解
- apk文件反编译工具apktool的下载,安装,使用
- Win7环境下用MyEclipse搭建Hbase开发环境
- Power oj 1782
- 黑马程序员--学习OC加强内存管理
- 全排列
- UE4 iOS设备的兼容性
- 利用数组实现缓存实例的不可变类
- 暑假集训第四周阶段二DP A - 最长公共子序列
- JNDI配置c3p0连接池
- hdu-3008魔兽争霸
- [译]Front-end-Developer-Interview-Questions
- 《Objective-C基础教程》第四章 继承