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) :表示弱指针引用一个对象.
注意:strong和weak都只能用于oc对象.
非oc对象仍然用assign. 如:基本数据类型.
内存管理的原则
单个对象内存管理的研究内容:
每个Target创建完成后默认ARC
野指针:指向已经被释放的对象空间的指针
空指针:没有指向任何对象的指针
僵尸对象:已经被释放的对象
内存泄露
1.创建完成 使用之后,没有release
2.没有遵守内存管理的原则