内存管理在C中就是管理由malloc,relloc,free等函数在堆区创建的内存,OC中是管理堆空间对象的内存
MRC手动引用管理
设置手动内存管理引用计数器要在Builldsetting ->All->搜索框输入auto->objective-C A R C的默认yes改为no即可
凡是遇到new,alloc,copy都会计数器+1.
ARC自动引用管理
GC垃圾回收机制
验证对象是否被回收掉,重写dealloc方法,用
-(void)dealloc{
NSLog(@"这个类的对象被回收掉");
//调用对象的方法
[super dealloc];
}
空指针是没有任何指向的指针,给空指针发消息不会报错
为了避免僵尸对象的问题,应该给被回收的对象赋值一个nil
MRC中不会自己增加引用计数和减少引用计数,需要程序员显视调用retain和release
已经被销毁(回收)的僵尸对象不能用retain复活
内存管理原则:谁创建的谁销毁,谁+1谁-1
野指针:不知道指向哪里的指针
什么情况出现野指针:1内存被回收了,但指针没有指向 2.定义了指针但没初始化
内存泄漏:没有回收就是内存泄漏
什么情况会出现内存泄漏:指针被回收了,但内存没有被回收
retain和release出现不成对,一定要成对出现,否则容易造成内存泄漏
误将对象p设置为nil(当对象p设置成nil就相当于给指针指向了空,也就是回收了p,但此时对象person new还存在,这时内存泄漏)
在函数中对p这个对象做了retain操作,造成内存泄漏
C:野指针 OC:僵尸对象
给对象(p指针这个对象)赋值为空nil;
给类对象赋值为空用Nil;
给指针赋值为空用NULL;
在处理MRC多个对象内存管理时,没有直接通用的方法
set方法里先-1再+1
如果属性为了提供外部访问,那么在类的内部应该全部使用带下划线的成员变量
如果属性实例变量有读写的特殊约定,那么在类的内部使用属性语法(self.成员变量)