OC内存管理

1.为什么要进行内存管理:

         因为我们的内存是有限的,如果我们无限度的去new或alloc,就会造成内存耗尽,程序崩溃。所以需要对内存进行管理。


2.内存管理主要是对内存中的堆区进行管理。因为堆中内存不连续, 无法自动释放


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

    为什么要内存管理:目的就是要防止内存泄露.

    内存泄露:一个对象不再使用.但这个对象却没有被销毁,空间没有释放,则这个就叫内存泄露.

  内存管理的原则:不再使用的对象必须销毁,释放内存.

内存分区由上到下依次为:

栈区:局部变量

堆区:程序运行过程中动态分配的存储空间

bss段:没有初始化的全局变量和静态变量,

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

代码段:程序编译以后代码的内容


栈区地址从高到低分配,堆区地址从低到高分配..内存管理,管理的就是OC中的对象内存

堆区: 对象

内存管理的原理及分类

对象的所有权及引用计数

  内存管理的方式:

 对象中有一个引用计数器在记录当前的引用.每增加一次引用,要让计数器加1,每减少一次引用要让计数器减一.

dealloc :对象被销毁时,必须执行这个方法.(系统会调用对象的这个方法)

凡事一个类 alloc new copy 都会让计数器的值设置为1.

谁引用,retain.各司其职.

谁alloc或new或copy  谁release !

谁retain 谁release!

多个对象指针如果指向同一个对象时,它们操作的计数器是同一个.

 注意:

 1.一个对象被销毁后,不能再使用.

 2.一个对象引用了另一个对象,则必须在对象引入的时候retain,然后在对象自已被销毁的时候release.

 3.循环引用:我们必须让两个类中的一个引用对象的时候是assign.表示不用在set对象进来时候retain.则那个对象计数器就不会变化.但是另一个类仍然要用retian.

 @class #import区别:

     @class 只会告诉编译器,这里要用到的是一个类,但是这个类里的属性与方法不知道,                                               #import是会把整个头文件拷贝到当前文件,则这个类以及这个类的属性与方法都知道.

    @class不需要拷贝文件内容,执行效率更高.我们只需要在需要有到这个对象里的属性或方法时,再去导入头文件即可.(推荐)

     #import只要导入,就会拷贝,不管这个文件是否要用到对象属性或方法.效率更低,同时,只要头文件改动,全部需要重新拷贝,编译.

 

MRC手动内存管理

ARC自动内存管理

 autorelease的用法

 作用:把对象放到一个自动释放池里,则对象会被自动回收.

 因为自动释放池销毁时会让对象调用release方法.

 用法:

 直接让对象创建后,调用一次autorelease方法.

 这个方法会返回对象本身.

 好处:

 不用关心对象在什么时候释放.

 注意:

 1.不能再调用autorelease方法后,再调用release.

 2.不能重复调用autorelease.

 自动释放池:@autoreleasepool

 作用:会把池内调用过autorelease的对象全部release一次.注意:是在这个池销毁的时候.

 不足:控制不灵活,只能等释放池销毁才会release.  

 注意:不要把大对象放在这里auturelease.占用内存大的对象要手动release,在对象用完之后.


ARC模式的用法

 Xcode5.0以后的全新的内存管理模式:ARC.

 以下添加或减少计数器值的方式,不再需要手动添加,全不能手动添加,编译器全部帮你实现.

 retian

 release

 autorelease

 不能用[suepr dealloc];但是能重写dealloc. 

 内存管理的所有的事情,由编译器在编译的时候添加了.

 

 ARC内存管理的原则:

 如果一个对象没有被强指针引用,则就会被回收.

 强指针:__strong 对象被销毁之后,指针仍然指向那片内存区域.成为野指针. (默认)

 弱指针:__weak   对象被销毁后,指针不再指向那片内存区域,成为空指针nil;

  :__weak Person *per= [[Person alloc] init];

 

注意:ARC模式无法自动解决循环引用问题

 解决办法:

 一个对象中引入另一个对象用strong,而另一个对象引用这个对象时,weak.

 @property (strong) :表示强指针引用一个对象.

 @property (weak)   :表示弱指针引用一个对象.

 注意:strongweak都只能用于oc对象.

 oc对象仍然用assign. :基本数据类型.

 

内存管理的原则

单个对象内存管理的研究内容:

每个Target创建完成后默认ARC

野指针:指向已经被释放的对象空间的指针

空指针:没有指向任何对象的指针

僵尸对象:已经被释放的对象

内存泄露

 1.创建完成 使用之后,没有release

 2.没有遵守内存管理的原则



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值