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

96 阅读2分钟

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

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

基本概念

Heap & Stack

  1. Heap:
    1. 低地址向高地址
    2. 线程共享
  2. Stack:
    1. 高地址向低地址 image.png

C内存管理

  1. malloc/free管理堆内存

C++内存管理

  1. new/delete
  2. 智能指针
    1. auto_pt 和 unique_ptr
      1. 不能指向同一个资源
      2. 无法进行左值赋值
    2. shared_ptr
      1. 可以赋值
      2. 实现:对象+引用计数,引用计数为0时,销毁

内存管理: C vs C++

  1. 空间
    1. malloc/free 只是动态分配内存空间/释放空间
    2. new/delete 还会调用构造函数和析构函数进行初始化与清理
  2. 计算大小
    1. malloc/free 需要手动计算类型大小
    2. new/delete 可自动计算类型的大小
  3. 安全性
    1. malloc/free 管理内存失败会返回0
    2. new/delete 管理内存失败会拋出异常

IOS内存管理机制

核心:管理强引用计数

MRC手动

已经弃用,使用retain和release

ARC自动

在编译时自动加入retain和release

实际应用

Property修饰符

  1. 修饰对象
    1. strong/weak:拥有/不拥有对象
      1. delegate用weak修饰
    2. copy:一般修饰不可变对象
  2. 简单类型
    1. assign

循环引用

循环引用将导致对象无法释放,导致内存泄漏

不可变 vs 可变

  1. 不可变:
    1. 对象数据不会被修改
    2. 线程安全
    3. 查找性能好
    4. 用于声明/方法参数/返回值
  2. 可变
    1. 对象数据可以被修改
    2. 线程不安全
    3. 查找性能差
    4. 用于方法内的临时变量

浅拷贝 vs 深拷贝

  1. NSString
    1. 浅拷贝copy
    2. 深拷贝mutableCopy
    3. 作为属性时,用copy和strong修饰,都是浅拷贝
  2. NSMutableString:两个方法都是深拷贝
    1. 作为属性时,用copy修饰是深拷贝,用strong修饰是浅拷贝(地址相同)

内存引起的Crash

  1. 访问野指针
  2. OOM内存占用过高