OC 内存小结

2022/07/28 posted in  Apple
Tags:  #Objective-C

内存区域

16587570612943

  • 栈一般用于存储参数/局部变量/函数调用后返回地址

C++ 内存管理

new & delete

  • malloc/free只是动态分配内存空间/释放空间。
    new/delete 还会调用构造函数和析构函数进行初始化与清理

  • malloc/free需要手动计算类型大小
    new/delete可自动计算类型的大小

  • malloc/free管理内存失败会返回0,
    new/delete等的方式管理内存失败会抛出异常。

智能指针

保留 -> 和 * 运算符

  • auto_pt & unique_ptr
    • 基于排他所有权模式:两个指针不能指向同一个资源
    • 无法进行左值unique_ptr复制构造,也无法进行左值复制赋值操作,但允许临时右值赋值构造和赋值
  • shared_ptr
    • 可以复制赋值操作
    • 对象+引用计数

OC 内存管理

MRC

  • “alloc”, “new”, “copy”, or “mutableCopy” 开头的方法创建的对象,引用计数 = 1
  • 对一个对象发送 retain 消息,可以让对象的引用计数 +1
  • 对一个对象发送 release 消息,可以让对象的引用计数 -1
  • 当对象的引用计数为 0 时,即将销毁的时候,系统会向对象发送一条dealloc消息 【不能直接调用 dealloc】

自动释放池

在创建新对象时,并且系统未启动ARC特性,那么在使用完该对象后需要释放对象空间。
此时有两种选择,一种是给对象发送release消息,此时该对象空间就会马上被释放掉;
另一种是给对象发送autorelease消息,此时系统不会马上释放该对象,而是在离它最近的自动释放池结束的位置会被释放掉,因为自动释放池在执行到末尾时,会给池中对象发送release消息,若引用计数减为0,会发送dealloc消息,并将它们的内存释放掉。

ARC

  • retain/release都不用考虑
    • 只需要初始化的时候 [[NSObject alloc] init]
    • 可以自定义 dealloc
  • 只要有一个强指针在内存指向对象,对象就不能释放
    • ARC 销毁时机是强引用的个数 = 0,而不是引用计数 = 0
  • 默认所有对象变量的指针都是强指针
    • 弱指针需显式声明
      __weak Person *p2 = [Person new];
      

属性修饰

修饰符 持有方式 用于
strong 对象
weak 对象
assign(默认) setter赋值 基本类型/对象

OC 属性小结

OC 深拷贝和浅拷贝

16587658669509

  • copy 创建不可变对象
  • mutaleCopy 创建可变对象
  • 可变对象是不可变对象的子类,因此不可变对象指针可以指向可变对象
  • 对于容器对象,深拷贝只拷贝最外一层,内部元素仍是浅拷贝

内存问题引起 crash

野指针、OOM