这是我参与「第四届青训营 」笔记创作活动的第8天
本篇笔记主要记录的Objective-C 内存管理中的重点内容
iOS内存管理
iOS 内存管理的核心是管理(强)引用计数(Reference Counting)
Objective-C内存管理
在OC中, 基本所有的类都将继承于NSObject, 并且, 任何继承NSObject的类都需要对内存进行管理.
- 防止对象之间产生强引用而不能释放内存空间(互相持有对方)
- 减少应用程序所占用的内存, 防止因过多占用被系统强制关闭, 造成crash
- 防止提前释放指针, 导致夜之战的产生, 造成crash
MRC Manual Reference Counting
故名思义, 手动引用计数
- OC使用引用计数来进行内存管理. 每个对象都有一个与引用计数器, 当持有一个对象, 其引用计数就会递增, 反之, 释放时该对象的引用计数就会递减. 当对象的引用计数变为0, 系统就会回收该对象.
- alloc、new、copy、mutableCopy创建对象, 引用计数=1
- 对对象发送retain消息, 引用计数+1, release消息则使得引用计数-1
- 引用计数为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