美文网首页
iOS 内存(系统引用的技术)了解

iOS 内存(系统引用的技术)了解

作者: 奋斗的小马达 | 来源:发表于2021-02-23 10:38 被阅读0次

    iOS程序的内存布局


    iOS内存布局.png

    Tagged Pointer

    1、从64bit开始,iOS引入了Tagged Pointer技术,用于优化NSNumber、NSDate、NSString等小对象的存储
    
    2、在没有使用Tagged Pointer之前, NSNumber等对象需要动态分配内存、维护引用计数等,NSNumber指针存储的是堆中NSNumber对象的地址值
    
    3、使用Tagged Pointer之后,NSNumber指针里面存储的数据变成了:Tag + Data,也就是将数据直接存储在了指针中
    
    4、当指针不够存储数据时,才会使用动态分配内存的方式来存储数据
    
    5、objc_msgSend能识别Tagged Pointer,比如NSNumber的intValue方法,直接从指针提取数据,节省了以前的调用开销
    
    如何判断一个指针是否为Tagged Pointer?
    iOS平台,最高有效位是1(第64bit)
    Mac平台,最低有效位是1
    
    
    Tagged Pointer引用前后对比.png

    OC对象的内存管理

    在iOS中,使用引用计数来管理OC对象的内存
    
    一个新创建的OC对象引用计数默认是1,当引用计数减为0,OC对象就会销毁,释放其占用的内存空间
    
    调用retain会让OC对象的引用计数+1,调用release会让OC对象的引用计数-1
    
    内存管理的经验总结
    当调用alloc、new、copy、mutableCopy方法返回了一个对象,在不需要这个对象时,要调用release或者autorelease来释放它
    想拥有某个对象,就让它的引用计数+1;不想再拥有某个对象,就让它的引用计数-1
    
    可以通过以下私有函数来查看自动释放池的情况
    extern void _objc_autoreleasePoolPrint(void);
    
    

    copy和mutableCopy

    copy和mutableCopy.png
     拷贝的目的:产生一个副本对象,跟源对象互不影响
     修改了源对象,不会影响副本对象
     修改了副本对象,不会影响源对象
    
     iOS提供了2个拷贝方法
     1.copy,不可变拷贝,产生不可变副本
     2.mutableCopy,可变拷贝,产生可变副本
     
     深拷贝和浅拷贝
     1.深拷贝:内容拷贝,产生新的对象
     2.浅拷贝:指针拷贝,没有产生新的对象
     
    

    相关文章

      网友评论

          本文标题:iOS 内存(系统引用的技术)了解

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