黑马程序员--学习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方式就不会出现这种问题了

0 0
原创粉丝点击