本文主在记录内存管理方面的关键概念,文中涉及均查自网络资料,如有不对的地方,欢迎指正!
环境: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 |