ARC工程中添加非ARC文件

时间:2021-07-29 03:22:17

转载自:http://blog.csdn.net/zhenweicao/article/details/16988543

分类: IOS2013-11-27 17:02 626人阅读 评论(0) 收藏 举报

转自:http://www.cnblogs.com/jiangshiyong/archive/2013/03/01/2938895.html

ARC工程中添加非ARC文件

转自http://blog.csdn.net/nicktang/article/details/6792972

Automatic Reference Counting (ARC) 是一个编译期的技术,利用此技术可以简化Objective-C编程在内存管理方面的工作量。

ARC与非ARC在一个项目中同时使用,

1,选择项目中的Targets,选中你所要操作的Target,

2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并在输入框中输入:-fobjc-arc,如果不要ARC则输入:-fno-objc-arc

Apple 文档

http://developer.apple.com/library/IOs/#releasenotes/ObjectiveC/RN-TransitioningToARC/_index.html

ARC是objc的未来

需要知道的一些事

1、你需要下载Xcode 4.2

2、ARC是编译器LLVM 3.0的新功能,而非iOS,因此ARC支持 Mac OS X v10.6 v10.7(64-bit applications) 以及 iOS 4 iOS 5. (遗憾的是,weakreference是runtime属性,因此 不支持 iOS 4 和 Mac OS X v10.6。)

3、你不能使用new开头的变量

4、可以使用 -fno-objc-arc 来标识哪些文件不使用ARC机制,对于很多第三方库来说很有用,能让我们顺利通过过渡期。

5、ARC只对objective-c对象起作用,对于Core Foundation 之类,你仍然需要自己手动释放。

ARC的优势:

自动计数(ARC)是一个编译期间工作的能够帮你管理内存的技术,通过它,程序人员可以不需要在内存的retain,释放等方面花费精力。

ARC在编译期间为每个Objective-C指针变量添加合适的retain, release,autorelease等函数,保存每个变量的生存周期控制在合理的范围内,以期实现代码上的自动内存管理。

In order for the compiler to generate correct code, ARCimposes some restrictions on the methods you can use, and on how you usetoll-free bridging (see “Toll-Free Bridged Types”); ARC alsointroduces new lifetime qualifiers for object references and declaredproperties.

你可以使用编译标记-fobjc-arc来让你的工程支持ARC。ARC在Xcode4.2中引入,在Mac OS X v10.6,v10.7 (64位应用),iOS 4,iOS 5中支持,Xcode4.1中不支持这个技术.

如果你现在的工程不支持ARC技术,你可以通过一个自动转换工具来转换你的工程(工具在Edit>Refactor>Convertto Objective-C ARC),这个工具会自动所有工程中手动管理内存的点转换成合适自动方式的(比如移除retain, release等)。这个工具会转换工程中所有的文件。当然你可以转换单个文件。

ARC使得你不需要再思考何时使用retain,release,autorelease这样的函数来管理内存,它提供了自动评估内存生存期的功能,并且在编译期间自动加入合适的管理内存的方法。编译器也会自动生成dealloc函数。一般情况下,通过ARC技术,你可以不顾传统方式的内存管理方式,但是深入了解传统的内存管理是十分有必要的。

下面是一个person类的一个声明和实现,它使用了ARC技术。

@interface Person : NSObject

@property (nonatomic, strong) NSString*firstName;

@property (nonatomic, strong)NSString *lastName;

@property (nonatomic, strong)NSNumber *yearOfBirth;

@property (nonatomic, strong) Person*spouse;

@end

@implementation Person

@synthesize firstName, lastName,yearOfBirth, spouse;

@end

(有关strong的帮助,请参考 “ARC Introduces New Lifetime Qualifiers.”)

使用ARC,你可以象下面的方式实现contrived函数:

- (void)contrived {

  Person *aPerson = [[Person alloc]init];
  [aPersonsetFirstName:@"William"];
  
  [aPerson setLastName:@"Dudney"];

  [aPerson:setYearOfBirth:[[NSNumberalloc] initWithInteger:2011]];

   NSLog(@"aPerson: %@",aPerson);

}

ARC管理内存,所以这里你不用担心aPerson和NSNumber的临时变量会造成内存泄漏。

你还可以象下面的方式来实现Person类中的takeLastNameFrom:方法,

- (void)takeLastNameFrom:(Person*)person {

  NSString *oldLastname = [selflastName];

  [self setLastName:[person lastName]];

  NSLog(@"Lastname changed from %@to %@", oldLastname, [self lastName]);

}

ARC可以保证在NSLog调用的时候,oldLastname还存在于内存中。

为了ARC能顺利工作,特增加如下规则,这些规则可能是为了更健壮的内存管理,也有可能为了更好的使用体验,也有可能是简化代码的编写,不论如何,请不要违反下面的规则,如果违反,将会得到一个编译期错误。

下面的这些函数:dealloc,retain, release, retainCount, autorelease。禁止任何形式调用和实现(dealloc可能会被实现),包括使用@selector(retain), @selector(release)等的隐含调用。

· 下面的这些函数:dealloc,retain, release, retainCount, autorelease。禁止任何形式调用和实现(dealloc可能会被实现),包括使用@selector(retain), @selector(release)等的隐含调用。

你可能会实现一个和内存管理没有关系的dealloc,譬如只是为了调用[systemClassInstance setDelegate:nil] ,但是请不要调用[super dealloc] ,因为编译器会自动处理这些事情。

·  你不可以使用NSAllocateObject或者NSDeallocateObject.

使用alloc申请一块内存后,其他的都可以交给运行期的自动管理了。

· 不能在C语言中的结构中使用Objective-c中的类的指针。

请使用类类管理数据。

· 不能使用NSAutoreleasePool.

作为替代,@autoreleasepool被引入,你可以使用这个效率更高的关键词。

·不能使用memory zones.

NSZone不再需要—本来这个类已经被现代Objective-c废弃。

ARC在函数和便利变量命名上也有一些新的规定

·  禁止以new开头的属性变量命名。

ARC Introduces New Lifetime Qualifiers

ARC introduces several new lifetime qualifiers forobjects, and zeroing weak references. A weak reference does not extend thelifetime of the object it points to. A zeroing weak reference automaticallybecomes nil if the object itpoints to is deallocated.

You should take advantage of these qualifiers to managethe object graphs in your program. In particular, ARC does not guardagainst strong reference cycles (previously known as retaincycles—see “Practical Memory Management”). Judicious useof weak relationships will help to ensure you don’t create cycles.

属性变量修饰符

weak和strong两个修饰符是新引进的,使用例子如下:

// 下面的作用和: @property(retain) MyClass*myObject;相同

@property(strong) MyClass *myObject;

// 下面的作用和"@property(assign) MyClass*myObject;"相识

// 不同的地方在于,如果MyClass的实例析构后,这个属性变量的值变成nil,而不是一个野指针,

@property(weak) MyClass *myObject;

自动释放池

使用ARC,你不能使用NSAutoReleasePool类来管理自动释放池了,作为替代,ARC使用一个新的语法结构:

@autoreleasepool {

// Code, such as a loop that createsa large number of temporary objects.

}

编译器根据工程是否使用ARC,来决定这个语法结构最终呈现方式,这个语法结构使用了一种比NSAutoReleasePool更高效的方式。

其他的新功能

使用ARC技术,可以使得在栈上分配的指针隐式的初始化为nil,比如

- (void)myMethod {

  NSString *name;

  NSLog(@"name: %@", name);

}

上面的代码会Log出来一个null,不会象不使用ARC技术的时候使得程序崩溃。

ARC在工程上的相关设置

在创建工程的时候,我们可以指定工程是否使用ARC技术,如下图

选中表示支持ARC,

在Beta5以前的版本中,不提供这个选项,非常麻烦。

如果是你拿到的工程,那么可以通过设置来改变,如下图所示

如果不容易找到,可以在设置的右上角输入ARC做一个过滤

ARC工程中添加非ARC文件的更多相关文章

  1. 【iOS开发】在ARC项目中使用非ARC文件

    ARC的出现应该说是开发者的一大福利,苹果是推荐使用的,但是因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中 ...

  2. arc项目中使用非arc文件

    因为之前没有ARC机制,好多比较好的类库都是使用的非ARC,或是有些大牛还是不喜欢用ARC,封装的类也是非ARC的,想要在自己的ARC项目中使用这些非ARC类库,只需要简单的设置一下就可以了. 1.在 ...

  3. IOS-在ARC项目中使用非ARC框架或者类库

    1.在ARC项目中使用非ARC框架或者类库 IOS 4引入了Automatic Reference Count(ARC),编译器可以在编译时对obj-c对象进行内存管理. 之前,obj-c的内存管理方 ...

  4. 在工程中添加pch文件

    在Xcode6之前,新建一个工程的时候,系统会帮我们自动新建一个以工程名为名字的pch (precompile header)文件,在开发过程中,可以将那些整个工程都广泛使用的头文件包含在该文件下,编 ...

  5. maven工程中防止mapper.xml文件被漏掉、未加载的方法

    maven工程中防止mapper.xml文件被漏掉.未加载的方法 就是在pom.xml文件中添加以下内容 <!-- 如果不添加此节点mybatis的mapper.xml文件都会被漏掉. --&g ...

  6. 工程中添加工程依赖 Xcode iOS

    有时我们需要在一个主工程中添加其他的子工程,用来对子工程进行编写修改或者是利用子工程中的库文件等等操作,这时候我们需要用到工程的嵌套.   步骤:(看图说话)   1.新建主工程,名为TestTTTT ...

  7. ios如何在当前工程中添加编辑新建的FramesWork

    本文转载至 http://www.apkbus.com/android-131519-1-1.html,感谢原文作者的分享.     naniboy 该用户从未签到   可能很多大牛都见过FaceBo ...

  8. 向php文件中添加php&period;ini文件

    向php文件中添加php.ini文件 默认情况下,php是没有php.ini配置文件的,必须手工添加php.ini文件 在php安装目录中,复制php.ini文件到/usr/local/php/lib ...

  9. gitignore文件中添加新过滤文件,但是此文件已经提交,如何解决?

    gitignore文件中添加新过滤文件,但是此文件已经提交到远程库,如何解决? 第一步,为避免冲突需要先同步下远程仓库 git pull 第二步,在本地项目目录下删除缓存 git rm -r --ca ...

随机推荐

  1. category中重写方法&quest;

    问:可以在category中重写方法吗? 答:代码上可以实现 在category中重写方法,但在实际开发中,不建议这样做.如果确实需要重写原有方法也建议使用子类进行重写. category是为了更方便 ...

  2. CentOS 6&period;8 LAMP 安装配置

    1.远程系统拒绝了连接: 需要关闭防火墙/etc/rc.d/init.d/iptables stop service iptables stop chkconfig iptables off sete ...

  3. 获取token,绑定微信号,自定义菜单,事件响应demo

    摘要: 这个demo包含了获取token,绑定微信号,设置自定义菜单,响应文本和事件 这个教程的基础篇和提升篇都看完了,总感觉有点隔靴挠痒的感觉,讲的东西我都懂,没有吸收多少新鲜的知识.貌似还没有我这 ...

  4. ThinkSNS插件的使用方法

    1.插件包放到/addons/plugin/ 目录下. 2.自定义一个插件钩子:修改/apps/public/Tpl/default/Index/index.html,约在65行左右,添加下面钩子.{ ...

  5. 5&period;MVC框架开发(强类型开发,控制器向界面传递数据的几种方法)

    界面表单中的表单元素名字和数据库表的字段名相一一映射(需要哪个表的数据就是那个表的模型(Model)) 在View页面中可以指定页面从属于哪个模型 注:以上的关系可以通过MVC的强类型视图开发来解决我 ...

  6. flutter初体验

    flutter初体验 和flutter斗争了两个周末,基本弄清楚了这个玩意的布局和一些常用组件了. 在flutter里面,所有东西都是组件Widget.我们像拼接积木一样拼接Widget,拼接的关键词 ...

  7. MySQL 5&period;1完全卸载

    第一步:控制面板里的增加删除程序内进行删除 第二步:删除MySQL文件夹下的my.ini文件,如果备份好,可以直接将文件夹全部删除 第三步:regedit进入注册表 HKEY_LOCAL_MACHIN ...

  8. &lbrack;React&rsqb; Simplify and Convert a Traditional React Form to Formik

    Forms in React are not easy. T render() { return ( <React.Fragment> <h2>Regular Maintena ...

  9. 2017-2018-1 《信息安全技术》实验二——Windows口令破解

    2017-2018-1 <信息安全技术>实验二--Windows口令破解 所用工具 系统:能勾起我回忆的Windows 2003 工具:LC5.SuperDic Windows口令破解 口 ...

  10. &lbrack;pixhawk笔记&rsqb;11-Windows下PX4代码查看

    由于项目需要做基于Simulink的PX4二次开发,在Windows下面做,所以需要在Windows下查看PX4的代码,故写该文档,记录环境安装和配置过程.按照该网页安装工具链:Windows Ins ...