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

157 阅读2分钟

这是我参与「第四届青训营 -IOS场」笔记创作活动的第1篇笔记

Objective-C(OC)的内存管理

一. 背景

Stack 栈

  • 具有先进先出(FIFO)的特性
  • 栈指针(Stack pointer)指向栈顶,一般存在寄存器
  • 由高地址指向低地址
  • 一般存储局部变量/参数/函数调用后返回的地址

Heap 堆

  • 手动分配分配堆空间
  • 地址向高地址拓展
  • 存储数组和对象,线程共享

C/C++的内存管理

  • C: 用 malloc & free 动态分配内存
  • C++: 新增使用 new & delete 动态分配内存

二. 介绍

  • 内存管理的对象是什么?

    • 继承自NSObject的对象,包括手动创建的对象和框架提供的类对象
  • 为什么要进行内存管理?

    • 多个对象互相强引用,会导致对象无法被释放
    • 一个程序如果占用内存过大,系统会强制关闭程序,造成内存的Crash
    • 如果提前释放指针(指在使用该指针之前),会导致野指针问题,造成内存Crash

三. OC中两种内存管理方式

  • MRC(手动引用计数)
    • 由开发者手动维护引用计数器来进行内存管理
    • 给对象发送retain消息,让对象引用计数+1
    • 给对象发送release消息,让对象引用计数-1
    • 当引用计数为0时 对象被销毁
  • ARC(自动引用计数)
    • 不用考虑retain和release 由系统计算引用计数
    • 指针分为强指针(strong)和弱指针(weak),默认使用强指针引用对象
    • ARC销毁的时机是当对象强引用计数为0时,对象会被销毁。

四. @property 修饰符

OC中一般使用@property来在类的.h文件下声明属性,包括继承自NSObject的对象属性和基本类型的属性,在创建实例时,会创建属性、setter和getter方法。形式:

@property(参数1, 参数2, 参数3...)(类型)属性名;

@property的与内存管理有关的参数

  • assign/strong/weak/copy
    • 基本类型变量/NSInteger/CGRect,使用assign
    • 当属性是一个继承自NSObject的类的对象时,使用strong/weak/copy
      • 当需要强持有属性对象时,使用strong
      • 当需要若持有属性对象时,使用weak
      • 对于NSString NSArray等等不期望被外界改变的属性,使用copy