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];