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的特点规则


  • 不允许调用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

时间: 2024-11-08 00:25:44

Xcode编译器特性:ARC(Automatic Reference Counting)的相关文章

Objective-C - ARC(Automatic Reference Counting)自动引用技术详解

ARC特点与判断准则 /* ARC的判断准则:只要没有强指针指向对象,就会释放对象 1.ARC特点 1> 不允许调用release.retain.retainCount 2> 允许重写dealloc,但是不允许调用[super dealloc] 3> @property的参数 * strong :成员变量是强指针(适用于OC对象类型) * weak :成员变量是弱指针(适用于OC对象类型) * assign : 适用于非OC对象类型 4> 以前的retain改为用strong 指针

Swift-自动引用计数(Automatic Reference Counting)(十四)

前言 在iOS5之后apple推出了相对于MRC(Mannul Reference Counting)的ARC(Automatic Reference Counting)的内存管理机制,前者是对内存的手动管理,后者是系统对内存的智能化管理.其实我学习iOS的时候已经推出到iOS7了,对于MRC机制我甚至连一知半解都算不上.有时候和iOS老司机交流的时候他们对于各种内存都很熟悉,感觉包括我在内的很多最近两年刚学习iOS开发的同学,都属于填鸭式的学习吧,知其然不知其所以然,甚至都没耐心去读优秀的源码

ARC(Automatic Reference Counting )技术概述

此文章由Tom翻译,首发于csdn的blog 转自:http://blog.csdn.net/nicktang/article/details/6792972 Automatic Reference Counting (ARC) 是一个编译期的技术,利用此技术可以简化Objective-C编程在内存管理方面的工作量. 这里我把此技术翻译为自动内存计数器管理技术,下图是使用和不使用此技术的Objective-C代码的区别. ARC技术是随着XCode4.2一起发布的,在缺省工程模板中,你可以指定你

does not support Objective-C Automatic Reference Counting (ARC)

iOS开发 JSonKit does not support Objective-C Automatic Reference Counting(ARC) 有使用JSonKit的朋友,如果遇到"JSonKit does not support Objective-C Automatic Reference Counting(ARC)"这种情况,可参照如下方法: 点击项目根目录->targets->Build Phases->JSONKit.m->添加"-

JSONKit does not support Objective-C Automatic Reference Counting(ARC) / ARC forbids Objective-C objects in struct

当我们在使用JSONKit处理数据时,直接将文件拉进项目往往会报这两个错“JSONKit   does not support Objective-C Automatic Reference Counting(ARC)”,“ARC forbids Objective-C objects in struct”,这是由于JSONKit库未更新,不支持ARC机制.我们可以参照如下步骤解决:

iOS开发 JSonKit does not support Objective-C Automatic Reference Counting(ARC)

有使用JSonKit的朋友,如果遇到“JSonKit does not support Objective-C Automatic Reference Counting(ARC)”这种情况,可参照如下方法: 点击项目根目录->targets->Build Phases->JSONKit.m->添加“-fno-objec-arc”字段,在运行就OK了.

[转]关于NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的解决方法

转载地址:http://blog.csdn.net/xbl1986/article/details/7216668 Xcode是Version 4.2 Build 4D151a 根据Objective-c 2.0程序设计上的旧版本的代码会发生NSAutoreleasePool' is unavailable: not available in automatic reference counting mode的错误 需要手动关闭工程中ARC 工程中 Build Settings--->Apple

长路漫漫,唯剑作伴--Automatic Reference Counting

一.简介 ARC,自动引用计数,是指iOS的内存管理使用引用计数的技术. 在OC中采用Automatic Reference Counting的机制,让编译器进行内存管理.在新一代的Apple LLVM编译器中设置ARC为有效状态,就不用再次键入retain.release代码,这在降低程序崩溃.内存泄漏等风险的同时,很大程度上减少了开发程序的工作量.编译器完全清楚目标对象,并能立刻释放那些不再被使用的对象(有待斟酌).如此一来,应用程序将具有可预测性,且运行流畅,速度也将大幅提升.(摘自苹果官

对照Java学习Swift--自动引用计数(Automatic Reference Counting)

自动引用计数(Automatic Reference Counting)简称ARC,是Swift对应用程序内存的跟踪和管理.跟Java里面的Gc类似,但是又不太一样. ARC是实例的引用数为0,ARC就会销毁这个实例. GC是当程序不能访问这个实例,称为该实例"不可达的",GC就会负责回收这些"不可达的"的实例,回收算法很复杂,Java规范对GC的很多行为都没有进行严格的规定,不同的厂商在各自实现的Jvm上都有不同的实现. ARC需要开发者保证实例不再被任何属性.常