zoukankan      html  css  js  c++  java
  • Xcode编译器特性:ARC(Automatic Reference Counting)

    一、         基本简介

    • ARC是自iOS 5/Mac OS X 10.7之后增加的新特性,消除了原先手动管理内存的烦琐,编译器会自动在适当的地方插入适当的retain、release、autorelease语句。你不再需要担心内存管理,因为编译器为你处理了一切
    • ARC 是编译器特性,而不是 iOS 运行时特性,它也不是类似于其它语言中的垃圾收集器。因此 ARC 和手动内存管理性能是一样的,有时还能更加快速,因为编译器还可以执行某些优化
    • 简单地理解ARC,就是通过指定的语法,让编译器(LLVM 3.0)在编译代码时,自动生成实例的引用计数管理部分代码,ARC并不是GC,它只是一种代码静态分析(Static Analyzer)工具。
    • ARC前后变化代码示例:

        开启ARC前:

    @interface NonARCObject : NSObject {  
        NSString *_name;  
    }  
    -(id)initWithName:(NSString *)name;  
    @end  
     
    @implementation NonARCObject  
    -(id)initWithName:(NSString *)name {  
        self = [super init];  
        if (self) {  
            _name = [name retain];    // 对象name被使用一次,引用计数器+1
        }  
        return self;  
    }  
                      
    -(void)dealloc {  
        [name release];          // 对象在被销毁时调用dealloc方法,该对象拥有的所有对象引用计数器都需要释放-1,这里需要在dealloc方法中释放对象name,引用计数器-1
        [Super dealloc];  
    }  
    @end  

        开启ARC后:

    @interface ARCObject : NSObject {  
        NSString *_name;  
    }  
    -(id)initWithName:(NSString *)name;  
    @end  
     
    @implementation ARCObject  
    -(id)initWithName:(NSString *)name {  
        self = [super init];  
        if (self) {  
            _name = name;  
        }  
        return self;  
    }  
    @end  

    二、         基本原理

    1.        规则

    ARC 的规则非常简单:只要没有强指针指向对象,就会释放对象

    2.        指针分两种

    • 强指针:__strong,默认情况下所有的指针都是强指针 __strong
    • 弱指针:__weak,指向的对象被回收后,弱指针会自动变为nil指针(一旦发现对象被回收,ARC直接把指针清空),不会引发野指针错误

    三、        ARC的特点规则

    •  不允许调用release、retain、retainCount
    •  允许重写dealloc,但是不允许调用[super dealloc]
    •  @property的参数

          * strong :成员变量是强指针(适用于OC对象类型)

          * weak :成员变量是弱指针(适用于OC对象类型)

          * assign : 适用于非OC对象类型  

            * 想长期拥有某个对象,应该用strong,其他对象用weak

            * 其他基本数据类型依然用assign

    •  以前的retain改为用strong
    • 两端互相引用时,一端用strong、一端用weak

    三、        ARC的开启和关闭

    将非ARC的代码转换为ARC的代码,大概有2种方式:

    1.使用Xcode的自动转换工具

    2.手动设置某些文件支持ARC

    一、Xcode的自动转换工具

    Xcode带了一个自动转换工具,可以将旧的源代码转成ARC模式

    1.ARC是LLVM 3.0编译器的特性,而现有工程可能使用老的GCC 4.2或LLVM-GCC编译器,因此首先需要设置使用LLVM 3.0编译器:

    (现使用的XCode4.5,LLVM 3.0已经升级到LLVM 4.1)

    最好也选上Warnings中的Other Warning Flags 为 -Wall,这样编译器就会检查所有可能的警告,有助于我们避免潜在的问题

     

    2.Build Options下面的Run Static Analyzer选项也最好启用,这样每次Xcode编译项目时,都会运行静态代码分析工具来检查我们的代码

     

    3.设置"Objective-C Automatic Reference Counting"选项为YES,不过Xcode自动转换工具会自动设置这个选项,这里只是说明一下如何手动设置

     

    4.打开Xcode的自动转换工具

    5.Xcode会显示一个新窗口,让你选择哪些文件需要转换

    点击Check按钮,Xcode可能会弹出对话框提示项目不能转换为ARC,需要你准备好转换(这里暂时省略详细说明)

    6.如果没有什么警告、错误了,就会弹出一下提示窗口:

    7.点击Next,几秒钟后,Xcode会提示所有文件的转换预览,显示源文件的所有改变。左边是修改后的文件,右边是原始文件。在这里你可以一个文件一个文件地查看Xcode的修改,以确保Xcode没有改错你的源文件

    点击Save即可完成转换

    8.自动转换之后,Xcode会移除所有retain、release、autorelease调用,这可能会导致代码出现其它警告、无效语法等,这些都需要自己手工进行修改

    注意:Xcode的自动转换工具最好只使用一次,多次使用可能会出现比较诡异的问题。假如你第一次转换没有转换所有的文件,当你稍后试图再次转换剩余的文件时,Xcode实际上不会执行任何转换操作。因此最好一次就完成转换,没有转换的文件可以考虑手工进行修改

    二、手动开启某些文件的ARC

    点击项目--->找到并点击builder pases--->

    在Compiler Flags一列加上-fobjc-arc就表示开启这个.m文件的ARC

    三、禁止某些文件的ARC

    同上:点击项目--->找到并点击builder pases--->

    在Compiler Flags一列加上-fno-objc-arc就表示禁止这个.m文件的ARC

  • 相关阅读:
    SignalR 聊天室实例详解(服务器端推送版)
    一种解决图片防盗链的方法
    python3基础-数学运算
    测试开发之路
    页面加载时让其显示笼罩层与加载等待图片
    在SQL SERVER中获取表中的第二条数据
    html+js 的一些小问题
    数据库连接错误问题
    ObjectStateManager 中已存在具有同一键的对象。ObjectStateManager 无法跟踪具有相同键的多个对象。
    正则表达式实例
  • 原文地址:https://www.cnblogs.com/lszwhb/p/3718403.html
Copyright © 2011-2022 走看看