本文主在记录内存管理方面的关键概念,文中涉及均查自网络资料,如有不对的地方,欢迎指正!
环境:iOS Xcode
内存管理的四条规则
| OC对象的动作 | OC对象的方法 | retainCount |
|---|---|---|
| 1.创建1个对象并获取它的所有权 | alloc/new/copy/mutableCopy | RC=1 |
| 2.获取对象所有权 | retain | RC+1 |
| 3.放弃对象所有权 | release | RC-1 |
| 4.释放对象 | dealloc | RC=0(此时自动调用dealloc) |
所有权修饰符
__strong
- 如果某个变量var被__strong修饰,当变量var指向某个对象obj时,那么变量var就持有对象obj的所有权;
- 如果某个变量var放弃对象的所有权:即release,当变量超过它的作用域、var被重新赋值或成员变量被丢弃时实现;
注:释放对象,即dealloc,当该对象的RC=0时,系统将来某个时刻(自动释放池触发时)自动调用对象所属类的dealloc方法。
__weak
- 被__weak修饰的变量var,var都不持有对象obj的所有权,即不会引起obj的RC变化;
- 当var指向的对象RC=0被释放时,变量会自动置为nil;
注:针对循环引用问题可以使用__weak解决
__unsafe_unretained 或 assign
- 和__weak类似,被__unsafe_unretained修饰的变量var不持有对象obj的所有权,即obj的RC不变;
- 不同于__weak,RC=0对象被释放时,使用__unsafe_unretained修饰的变量指针不自动置为nil;
注:对象释放后,使用__unsafe_unretained修饰的变量,指针不自动置为nil,此时再访问该对象,该对象已经不存在会造成非法访问(Invalid Access),即:野指针崩溃。
__autoreleasing
- 加入自动释放池,由编译器隐式实现。
属性修饰词
ARC下属性修饰词和所有权修饰符对应关系如下:
| 属性修饰词(property modifer) | 所有权修饰符(owership qualifer) |
|---|---|
| strong | __strong |
| retain | __strong |
| copy | __strong |
| weak | __weak |
| assign | __unsafe_unretained |
| unsafe_unretained | __unsafe_unretained |
