oc增强之手动内存管理

来源:互联网 发布:mac队全灭第几集 编辑:程序博客网 时间:2024/05/16 05:57
一、内存管理的概念


1、为什么要进行内存管理


由于移动设备的内存极其有限,所以每个APP所占的内存也是有限制的,当app所占用的内存 较多时,系统就会发出内存警告,个app可用的内存是被限制的,如果一个app使用的内存超 过20M,则系统会向该app发送Memory Warning消息。收到此消息后,需要回收一些不需要再 继续使用的内存空间,比如回收一些不再使用的对象和变量等,否则程序会崩溃。


2、oc内存管理的范围




管理范围:
管理任何继承NSObject的对象,对其他的基本数据类型无 效。


3、oc内存管理的原理


1)对象的所有权及引用计数
对象所有权概念
任何对象都可能拥有一个或多个所有者。只要一个对象至少还拥有一个所有者,它就会 继续存在


Cocoa所有权策略
任何自己创建的对象都归自己所有,可以使用名字以“alloc”或“new”开头或名字中 包含“copy”的方法创建对象,可以使用retain来获得一个对象的所有权








对象的引用计数器
每个OC对象都有自己的引用计数器,是一个整数表示对象被引用的次数(有多少个所有 者),即现在有多少东西在使用这个对象。对象刚被创建时,默认计数器值为1,当计数器 的值变为0时,则对象销毁




1)引用计数器的作用
引用计数器是判断对象要不要回收的依据(存在一种例外:对象值为nil时,引用计数为0, 但不回收空间)就是计数器是否为0,若不为0则存在。
  2) 对引用计数器的操作
给对象发送消息,进行相应的计数器操作。 retain消息:使计数器+1,该方法返回对象本身 release消息:使计数器-1(并不代表释放对象) retainCount消息:获得对象当前的引用计数器值
%lu %tu
3) 对象的销毁


当一个对象的引用计数器为0时,那么它将被销毁,其占用的内存被系统回收。 当对象被销毁时,系统会自动向对象发送一条dealloc消息,一般会重写dealloc方法,在这 里释放相关的资源,dealloc就像是对象的“临终遗言”。 一旦重写了dealloc方法就必须调用[super dealloc],并且放在代码块的最后调用(不能直 接调用dealloc方法),放到最后的原因:你所创建的每个类都是从父类,根类继承来的,有 很多实例变量也会继承过来,这部分变量有时候会在你的程序内使用,它们不会自动释放内 存,你需要调用父类的 dealloc方法来释放,然而在此之前你需要先把自己所写类中的变量 内存先释放掉,否则就会造成你本类中的内存积压,造成泄漏。 一旦对象被回收了,那么他所占据的存储空间就不再可用,坚持使用会导致程序崩溃(野指 针错误)。
注意;
1) 如果对象的计数器不为0,那么在整个程序运行过程,它占用的内存就不可能被回收(除 非整个程序已经退出 )
2)任何一个对象, 刚生下来的时候, 引用计数器都为1。(对象一旦创建好,默认引用计数 器就是1)当使用alloc、new或者copy创建一个对象时,对象的引用计数器默认就是1




4、oc内存管理的分类


Objective-C提供了三种内存管理方式:
MannulReference Counting(MRC,手动管理,在开发 iOS4.1之前的版本的项目时我们要
自己负责使用引用计数来管理内存,比如要手动 retain、release、autorelease 等,而在其后 的版本可以使用 ARC,让系统自己管理内存。)
automatic reference counting(ARC,自动引用计数,iOS4.1 之后推出的)
garbage collection(垃圾回收)。iOS不支持垃圾回收; ARC作为苹果新提供的技术,苹果推荐开发者使用ARC技术来管理内存;
开发中如何使用:需要理解MRC,但实际使用时尽量用ARC


二、手动内存管理快速入门
1、关闭ARC的方法(其中之一)
 

    1)设置项目信息



设置ARC 为NO

2、手动管理快速入门




内存管理的关键如何判断对象被回收?
重写dealloc方法,代码规范
(1)一定要[super dealloc],而且要放到最后,意义是:你所创建的每个类都是从父类, 根类继承来的,有很多实例变量也会继承过来,这部分变量有时候会在你的程序内使用,它 们不会自动释放内存,你需要调用父类的 dealloc方法来释放,然而在此之前你需要先把自 己所写类中的变量内存先释放掉,否则就会造成你本类中的内存积压,造成泄漏


(2)对self(当前)所拥有的的其他对象做一次release操作 -(void)dealloc
{
          [_car release];
          [super dealloc];
      }
注意
1)永远不要直接通过对象调用dealloc方法(实际上调用并不会出错)
一旦对象被回收了, 它占用的内存就不再可用, 坚持使用会导致程序崩溃(野指针错误)为 了防止调用出错,可以将“野指针”指向nil(0)。
Person.h
#import <Foundation/Foundation.h>
@interface Person : NSObject @property int age;
@end
Person.m
#import "Person.h" @implementation Person
//监测对象是否被回收的方法 -(void)dealloc{
//释放子类对象
NSLog(@"Person dealloc!"); //释放父类
[super dealloc];
}
@end


三、内存管理的原则


1、内存管理的原则
1)原则
只要还有人在使用某个对象,那么这个对象就不会被回收; 只要你想使用这个对象,那么就应该让这个对象的引用计数器+1; 当你不想使用这个对象时,应该让对象的引用计数器-1;
2)谁创建,谁release
(1)如果你通过alloc,new,copy来创建了一个对象,那么你就必须调用release或者 autorelease方法
(2)不是你创建的就不用你去负责
3)谁retain,谁release
只要你调用了retain,无论这个对象时如何生成的,你都要调用release
4)总结
有始有终,有加就应该有减。曾经让某个对象计数器加1,就应该让其在最后-1(让引用计数 器复原到使用之前的状态).
2、内存管理研究内容
1)野指针(僵尸对象)
僵尸对象: 已经被销毁的对象(不能再使用的对象) 野指针: 指向僵尸对象(不可用内存)的指针
空指针: 没有指向存储空间的指针(里面存的是nil, 也就是0)
2)内存泄露
内存泄露:就是创建的对象不能释放,所占用的空间没有得到回收


0 0
原创粉丝点击