美文网首页开发-收藏iOS Developer将来跳槽用
【iOS内存】内存管理基本概念和原理

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

作者: 24c41111e47b | 来源:发表于2016-07-06 16:00 被阅读65次

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

        本文链接:https://www.haomeiwen.com/subject/yjukjttx.html