什么是内存管理?
- 程序在运行的过程中通过以下行为,来增加程序的内存占用
- 创建一个OC对象
- 定义一个变量
- 调用一个函数或者方法
- 如果程序占用内存较大,系统可能会强制关闭程序,造成程序崩溃、闪退现象,影响用户体验
需要进行内存管理的对象有哪些?
- 任何继承了NSObject的对象需要进行内存管理
- 一些其他类型(int, char,float,double,struct,enum等)不需要进行内存管理
why?
- 因为继承了NSObject的对象的存储是在操作系统的堆里面,堆一般由程序员人工释放,如果程序员不释放,程序结束的时候可以由OS回收
*非OC对象的存储一般在操作系统的栈里面,栈里面的由操作系统自动分配释放,FILO(先进后出)
例子:int main(int argc, const char * argv[]){ @autoreleasepool { int a = 10; // 栈 int b = 20; // 栈 // p : 栈 // Person对象(计数器==1) : 堆 Person *p = [[Person alloc] init]; } // 经过上面代码后, 栈里面的变量a、b、p 都会被回收 // 但是堆里面的Person对象还会留在内存中,因为它是计数器依然是1 }
iOS运行环境不支持自动垃圾回收,只有两种MRC 和ARC
dealloc方法
- 当一个对象的引用计数器为0时,这个对象即将被销毁,其占用的内存被系统回收
- 对象即将被销毁时系统会自动给对象发送一条dealloc消息,所以可以根据dealloc方法有没有被调用,可以判断出对象是否被销毁
如果重写了dealloc方法,就必须调用[super dealloc]方法,并且一定要放到所有代码的最后面调用
不能直接调用dealloc方法,一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)