Objective-C的内存管理机制是由程序员自己手动管理,与Java的由JVM管理的垃圾回收机制是不同的。
在Objective-C中,创建对象完成了三个过程:
1) 分配内存空间,存储对象
2) 初始化成员变量
3) 返回对象的指针地址
1. 对象再完成初始化创建的同时,内部会自动创建一个引用计数器,这个计数器,是系统用来判断是否回收对象的唯一依据,当我们的引用计数retainCount = 0的时候,系统会毫不犹豫回收当前对象。
2. [对象 release] retainCount – 1
3. [对象 retain] retainCount + 1
4. 我们的引用计数retainCount = 0的对象就被销毁了
5. dealloc 函数,当一个对象要被销毁的时候,系统会自动调用dealloc函数,通知对象将要被销毁。
内存管理原则(配对原则):只要出现了new,alloc,retain,就一定配对出现一个release,autorelease
EXC_BAD_ACCESS访问了不可访问的内存空间
被系统回收的对象我们称之为僵尸对象
默认情况下Xcode为了提高编码效率,不会时时检查僵尸对象
如果想要时时检查僵尸对象,
手动内存管理研究问题方法:
1. 野指针
如果你确定当前作用域中的对象已经不会在被使用了,为了防止野指针操作,通常我们会把不在使用的指针变量赋值为nil
避免野指针操作的方法 [nil release]
2. 内存泄漏
假设有一个Person类
内存泄漏第一种情况:
只要对象的retainCount != 0 就会一直存在内存中
内存泄漏指的是,不再被使用的对象,一直在内存中没有被销毁。
内存泄漏的第二种情况
retainCount= 1
Person*p = [Person alloc] init];
p = nil;
[prelease];
第三种情况:
Person*p = [Person alloc] init];
Person*p1 = p;
[prelease];
第四种情况:
//1
Person*p = [Person alloc] init];
//0
[prelease];
//野指针操作,当一个对象retianCount已经为0时,调用retain方法,是不会使得对象起死回生的,同时还会发生野指针操作异常
[pretain];
程序出现错误,发送了一条消息给已经释放的对象了。