zoukankan      html  css  js  c++  java
  • ARC

    最近开是做新项目,准备尝试使用ARC,记录遇到的一些问题。

    ARC是编译器特性,所以要求Xcode的最低版本为4.2,iOS4以上(注意weak是ios4以上才有的,ios4中只能使用__unsafe_unretained)。

    ARC的规则:

    1. 不能调用dealloc方法(可以重写,做一些清除操作,例如delegate置空,清除非ARC管理的内存,不能调用[super dealloc],编译器会自动帮你出入该代码),不能调用retain,release,autorelease,retainCount。
    2. CFRetain,CFRelease仍正常使用
    3. NSAllocateObject 和 NSDeallocateObject 都不能使用(从没用过)
    4. 使用alloc创建对象,运行时自动来销毁对象
    5. C结构体中不能使用对象指针,推荐使用oc对象来代替C结构体
    6. id和void *之间不能随便的转换,详细请见Managing Toll-Free Bridging
    7.  不能使用NSAutoreleasePool,ARC提供autoreleasepool blocks来代替,比NSAutoreleasePool具有更高的效率(Why?)
    8. 不能使用NSZone

    注意:

      在ARC使用属性时,不能使用new做前缀(应该是ARC在编译器阶段会为属性方法自动添加new做前缀)

     ARC新增几个对象生命周期限定符

    1. 属性 (weak和strong,strong 是默认属性)
    2. 成员变量(__strong,__weak,__unsafe_unretained,__autoreleasing)

      __strong强引用,系统不会释放指向强引用的对象,类似retain

          __weak弱引用,类似assign,区别是当被引用的对象销毁时,引用对象会被自动置空

      __unsafe_unretained与__weak类似,唯一区别是当被引用对象销毁时,它不会被自动置空,因此可能会成为野指针

      __autoreleasing用来传递引用参数,返回时会自动的释放

    使用编译器标识激活ARC:-fobjc-arc

    禁止ARC:-fno-objc-arc

    可以使用下面宏来兼容ARC和非ARC下的属性声明

    #ifndef MB_STRONG
    #if __has_feature(objc_arc)
        #define MB_STRONG strong
    #else
        #define MB_STRONG retain
    #endif
    #endif
    
    #ifndef MB_WEAK
    #if __has_feature(objc_arc_weak)
        #define MB_WEAK weak
    #elif __has_feature(objc_arc)
        #define MB_WEAK unsafe_unretained
    #else
        #define MB_WEAK assign
    #endif
    #endif
    View Code

    ARC下Block如何使用?

  • 相关阅读:
    hadoop2.2编程:MRUnit测试
    TestLinkConverter编程纪要
    Redisson的分布式锁的简单实现
    Jmeter工具使用
    JVM的学习(三)
    Mybatis需要注意的地方及知识点
    JVM学习二(JAVA的四种引用)
    mysql的引擎
    JVM学习一(JVM的内存结构和垃圾回收)
    JDk1.8HashMap的源码分析
  • 原文地址:https://www.cnblogs.com/wustlj/p/3908423.html
Copyright © 2011-2022 走看看