【iOS内存】内存管理基本概念和原理

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

你可能感兴趣的:(【iOS内存】内存管理基本概念和原理)