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

130 阅读2分钟

这是我参与「第四届青训营 」笔记创作活动的第8天
本篇笔记主要记录的Objective-C 内存管理中的重点内容

iOS内存管理

iOS 内存管理的核心是管理(强)引用计数(Reference Counting)

Objective-C内存管理

在OC中, 基本所有的类都将继承于NSObject, 并且, 任何继承NSObject的类都需要对内存进行管理.

  1. 防止对象之间产生强引用而不能释放内存空间(互相持有对方)
  2. 减少应用程序所占用的内存, 防止因过多占用被系统强制关闭, 造成crash
  3. 防止提前释放指针, 导致夜之战的产生, 造成crash

MRC Manual Reference Counting

故名思义, 手动引用计数

  1. OC使用引用计数来进行内存管理. 每个对象都有一个与引用计数器, 当持有一个对象, 其引用计数就会递增, 反之, 释放时该对象的引用计数就会递减. 当对象的引用计数变为0, 系统就会回收该对象.
  2. alloc、new、copy、mutableCopy创建对象, 引用计数=1
  3. 对象发送retain消息, 引用计数+1, release消息则使得引用计数-1
  4. 引用计数为0时候, 系统会发送dealloc消息, 进行销毁

Autorelease-Pool (@autoreleasepool)

为了保证声明的对象最终都被系统释放并回收内存空间, oc提供了@autoreleasepool, 在其内声明的对象最终都能够被统一释放

ARC Auto Reference Counting

故名思义, 自动引用计数

  • 使用 [[Object alloc] init] 所初始化的对象都能够进行自动引用, 并且能够自定义dealloc方法
  • ARC销毁时为 强引用 个数为0
  • 默认所有的对象变量指针都是强指针

内存管理 - 编程实例

@property 属性

属性声明了类的成员变量, 并且还有属性的setter、getter, 并且能够对setter、getter进行重写(overide)

@interface Person
@property … Dog * dog;
//Getter 
- (Dog *)dog; 
//Setter 
- (void)setDog:(Dog *)dog;
@end

属性修饰符 - strong、weak、assign

strong: 拥有属性对象, 也称为强持有

weak: 不拥有属性对象, 成为弱持有

assign: 指定setter使用简单赋值, 一般用于简单类型(int、double)、基本类型(NSInteger、CGRect等)

@interface Person : NSObject 
@property (nonatomic, strong) Dog *dog; 
@property (nonatomic, copy) NSString *name;
@property (nonatomic, weak) id<PersonDelegate> delegate; 
@property (nonatomic, assign) int age; 
@end