zoukankan      html  css  js  c++  java
  • 对于ARC的一些理解心得

         我们在开发的时候都知道有arc和mrc

         那么我们现看arc是什么:arc的全称是automatic reference counting (arc) 是一个编译期的技术,利用此技术可以简化objective-c编程在内存管理方面的工作量。

         arc在xcode4.2中引入,在mac os x v10.6,v10.7 (64位应用),ios 4,ios 5中支持,xcode4.1中不支持这个技术。

        我们使用的arc 其实是oc编译器的特性,而不是运行时特性或者垃圾回收机制,ARC做的是在代码编译是为你自动在合适的位置插入release或者autorelease,只要没有强指针指向对象,对象就会被释放掉。它分为两部分,一个是前段编译器,用来插入release或者retain。另一个是优化器,因为代码中可能会出现release的重复调用等等一些多余的情况,这时候优化器就会自动负责移除这些多余的指令,保证生成的代码的运行质量。

        这里插入一个对于NSZone的理解和简单介绍:arc模式中不可以调用nszone的方法。NSZone可以简单想象为一个内存池,alloc或是dealloc这些操作,都是在这个内存池中操作的。默认的NSZone的缺陷在于,它是全局范围的,时间一长,导致内存的碎片化,那么性能就会受到一些影响。我们一般用到这个类一般都是在字符串定义之后  有copyWithZone的方法调用。

       ARC中有很多限制和规定:

    1.不能使用retain/release/retainCount/autorelease
    使用ARC,内存管理由编译器来负责,无需写上面关键词

    不能再使用nsautoreleasepool对象,arc提供了@autoreleasepool块来代替它,这样更加有效率。
    2.在ARC环境下,使用alloc/new/copy/mutableCopy来生成/持有对象
    copy/mutableCopy的使用需要copyWithZone的支持,如果没有,则不支持copy/mutableCopy
    3.不能显示调用[super dealloc]
    4.使用@autoreleasepool块来替代NSAutorealeasePool
    5.不能使用内存存储区(不能再使用nszone)
    6.对象变量不能作为C语言结构体的成员
    7.显示转换id和void *
    在不使用ARC时,下面的转化是正确的
    id obj=[[NSObject alloc] init];
      void *p=obj;
    如果使用ARC,上述转换就会报错,加__bridge转换
     id obj=[[NSObject alloc] init];
            void *p=(__bridge void*)obj;

    8.声明outlet时一般应当使用weak,除了对storyboard 这样nib中间的顶层对象要用strong

    9.weak 相当于老版本的assign,strong相当于retain

  • 相关阅读:
    如何解决selenium打开chrome提示chromedriver.exe已停止工作
    移动端弱网测试 fiddle
    android 真机设备识别不出adb interface
    网络基础知识
    《Mongo权威指南》学习手记
    MongoDB数据库备份
    windows下安装mongoDB(zip版)
    ubuntu apt
    docker 免sudo设置(仅3个命令)
    ubuntu18.04双卡机安装ubidia驱动遇到的坑
  • 原文地址:https://www.cnblogs.com/wangxiaoqi/p/6408283.html
Copyright © 2011-2022 走看看