iOS内存管理

什么是内存管理?
  • 程序在运行的过程中通过以下行为,来增加程序的内存占用
    1. 创建一个OC对象
    2. 定义一个变量
    3. 调用一个函数或者方法
  • 如果程序占用内存较大,系统可能会强制关闭程序,造成程序崩溃、闪退现象,影响用户体验
需要进行内存管理的对象有哪些?
  • 任何继承了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方法,一旦对象被回收了,它占用的内存就不再可用,坚持使用会导致程序崩溃(野指针错误)
fighting.jpg

你可能感兴趣的:(iOS内存管理)