内存管理常用知识点总结

int  类型数据   占4个字节

指针数据占8个字节

栈里面的变量是会自动释放,堆里面的内存不会自动释放所以内存管理只管理OC对象。

——基本数据类型占的字节数固定,对象数据类型占的字节大小不固定

——程序执行完毕后,栈内存会自动释放,堆内存不会自动释放,所以要对OC对象进行内存管理

引用计数器是一个在OC对象内部的一个int类型的变量,

只要使用了alloc 、new、 copy 这些创建一个对象时,这个对象的引用计数器就是1。

对象一旦创建好,默认引用计数器就是1

内存管理的本质是:通过操作对象的引用计数器来间接控制对象是否被释放。

dealloc方法是一个对象即将被销毁时候由系统调用的。在MRC中我们可以重写这个方法,

要注意:重写dealloc方法时候一定要调用[super   dealloc];  而且在写在最后面调用。

**********************

1、僵尸对象:已经销毁,不能再被使用的对象就是僵尸对象。(当访问僵尸对象,会报告“坏访问”)错误。

2、野指针:指向僵尸对象的指针就是野指针。(会报告“坏内存访问”错误)。

3、空指针:不指向任何对象的指针就是空指针。比如:NSString *str = nil;  就是空指针。

4、空指针的地址是0,对象时nil。野指针的地址是一个真实存在的地址,不过里面的对象已经被释放。

5、为了避免出现野指针错误,在对象被销毁之后,将指向对象的指针变成nil。

6、在出现多重赋值时候,要release旧值,retain新值。再把新值赋值给属性的成员变量。

7、在多重赋值的时候,如果赋值对象一直都是旧值,那么就不执行任何操作。

8、所以结合6和7,在给对象的某一个属性赋值时,要在属性的set方法中先进行判断:要赋的值是新值还是旧值。

       如果是旧值,就什么都不做。如果是新值,就先release旧值,再retain新值。

9、内存管理原则:谁创建,谁release。谁retain,谁release。

使用@class可以不用引用一个头文件下的东西,这样可以节约编译时间。

使用#import就是把这个头文件下的所有内容都拷贝到引用它的地方,在编译的时候比较耗费时间。

所以建议使用@class,减少编译时间。还可以避免循环引用。

自动释放池:当调用了[p1    autorelease]; 之后, p1对象的引用计数还是没有没有变化的 ,只是把这个对象

放到了自动释放池中。当自动释放池被销毁前,会对池子中的所有autorelease对象都做一次release操作,对象被释放

使用自动释放池,严禁把一个对象使用多次autorelease。否则会报僵尸对象错误。

自动释放池是以栈的结构进行管理的,栈是先进后出。

ARC是编译器自动添加内存管理代码。MRC是手动的内存管理,需要手动的来管理对象的内存。

ARC和其他语言的“垃圾回收机制”不同。ARC:编译器特性。“垃圾回收”运行时特性。

在ARC中可以调用dealloc方法,但是不能写 [super  dealloc];

原文地址:https://www.cnblogs.com/fs-ios/p/4704497.html