内存管理

来源:互联网 发布:淘宝售后电话是多少 编辑:程序博客网 时间:2024/06/06 05:12

内存五大分区:

栈区——作用:存放局部变量(数据内存地址由高到底)内存空间不需要手动回收,局部变量所在代码块或是函数自动处理;

堆区——作用:存放程序运行过程中动态分配的存储空间(内存地址是从低到高分配) new(内存申请)->初始化->分配空间    对象内存

BBS段——没有初始化的全局变量和静态变量

数据区——已经初始化的全局变量和静态变量和字符串常量

代码区——程序编译后的内容

PS:BBS段、数据区、代码区是在程序启动时就自动加载的,这三个区的数据过多会导致程序启动变慢,自动加载内存空间无需手动管理

oc中有两种内存管理机制MRC(手动内存管理)和ARC(自动内存管理),ARC是基于MRC。手动内存管理原则,”谁引用谁释放“;在XCODE4.2版本之后系统提供ARC内存自动管理机制,可在点击项目后在导航找到BundleSetting对里面的ARC进行设置,关闭内存管理将其设置为NO,开启设置为YES;

PS:该设置只针对当前项目并非xcode软件的设置

内存涉及到硬件资源,程序的开发需合理对资源的控制和利用,OC中没有GC内存管理,它使用的是引用计数管理。

内存管理是针对继承于NSObject所创建的对象分配的内存进行管理,该内存在堆区中。

内存管理名词:retainCount引用计数器,对象所有权

引用计数器:指的是当对某个对象进行引用的时候他会自动+1,调用函数alloc,retain,new,copy都会使引用计数器加一;当调用release方法的会使应用计数器减一;OC中依据引用计数器对内存进行管理,当引用计数器为0的时候,系统默认会调用dealloc对对象进行销毁释放内存空间。

PS:调用release不等于会释放对象,要引用计数器为0的时候才会销毁对象释放内存

对象所有权:最简单一句:谁创建该对象就是属于谁的,有人在使用或引用这个对象,有归属。可通过alloc,new,copy进行创建对象,retain是对已经创建好的对象获取它的所有权;

PS:alloc,retain,copy,new都是返回对象的引用(指针)

dealloc的覆写

-(void)dealloc{

//最后需要处理的代码,俗称:临终遗言,当引用计数(retainCount)为0的时候自动执行该函数销毁对象释放内存空间

//常用于将引用变量设置为nil避免野指针造成内存泄露的问题

[super dealloc];

//两个作用:1、销毁父类未处理的对象;

//2、该函数自己的内存处理也是由父类操作

}


@property属性设置中时常用到copy和retain设置steer的赋值方式,其原型如下:

//@property(copy)原型
-(void)setA:(NSString *)a{    if(_a!=a){        [_a release];        _a=[a copy];    }}
//@property(retain)原型
-(void)setA:(Car *)a{    if(_a!=a){        [_a release];        _a=[a retain];    }}
copy属性:复制内容将原来的旧值release掉后重新创建对象再将内容赋值给新对象后返回新对象的引用给变量,赋值后指向不同的内存区域。适用于不变对象;

retain属性:只是获取对象的引用(指针)赋值给新的变量,最后指向同一块内存区域。适用于可变对象。




1 0