Object- C 内存管理 | 青训营笔记

87 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第2天

C/C++的内存管理

  • C 用malloc/free动态分配内存
  • C++ 用new/delete分配内存
malloc/free(C)new/delete(C++)
只是动态分配内存空间/释放空间还会调用构造函数和析构函数
需要手动计算类型大小可自动计算类型的大小
管理内存失败会返回0管理内存失败会抛出异常
  • C++内存管理
    • 智能指针smart pointer
    • 保留->和*运算符
auto_pr & uique_ptrshared_ptr
两个指针不能指向同一个地址可以复制赋值操作
不能进行左值赋值构造对象+引用计数器
  • 引用计数器(Reference Counting)
    • 记录了当前资源到底有多少指针在引用(可以访问这个资源)
    • 当新增加一个可以访问这个资源的引用,计数器会加1,反之会减去1
    • 当引用计数=0时,对象会被销毁

iOS内存管理

  • iOS内存管理的核心是管理(强)引用计数
  • 任何继承NSObject的对象都需要进行内存管理
  • 继承NSObject的对象会分配到堆里

MRC (Manual Reference Counting)

  • retain -> 引用计数+1
  • release -> 引用计数-1
  • 当对象的引用计数=0即将销毁,系统会向对象发送dealloc
  • “alloc”,“new”,“copy”,“mutableCopy”创建的对象,引用计数=1

ARC (Automatic Reference Counting)

  • retain/release 都不用手动写
    • 只需要负责对象的创建即可
    • 不需要手动维护引用计数
  • 只要有一个强指针在内存指向对象,对象就不能释放
    • ARC销毁时机是强引用的个数=0
    • 而不是引用计数=0
  • 默认所有对象变量的指针都是强指针
    • 弱指针需要显式声明

自动释放池(Autorelease-pool)

  • 对象会放到自动释放池,统一释放
  • autorelease和release的区别:
    • release是马上释放对某个对象的强引用
    • autorelease是延迟释放某个对象
  • 部分场景下,使用autorelease pool可以降低内存峰值

Property

  • strong
    • 拥有属性对象
    • 强持有
    • 只有OC对象才能使用该属性
  • weak
    • 不拥有属性对象
    • 弱持有
    • 只有OC对象才能使用该属性
  • copy
    • 拥有属性对象的拷贝
  • assign
    • 指定setter使用简单赋值
    • 一般用于基本类型/NSInteger/CGRect
    • default修饰符

深浅拷贝

  • 浅拷贝
    • 指针拷贝
    • 复制一个新的指针,指向同一块内存区域,实际上内存并没有发生拷贝
  • 深拷贝
    • 内容拷贝
    • 拷贝数据到一块新内存区域,指针指向拷贝到数据区
copymutablecopy
不可变对象浅拷贝深拷贝
可变对象深拷贝深拷贝