旧工程配置arc方案:

1,直接在targets->build phases中修改compiler Flags,是否支持arc。添加:-fobjc-arc,就可以让旧项目支持arc。

新工程配置arc方案,新工程里面使用ARC,但是使用旧的库没有使用arc:

如果想让原来支持arc的不使用arc则添加-fno-objc-arc

直接在targets->build phases中修改compiler Flags,

这样以来,新旧工程的ARC适配问题就解决了。

说明:在arc中,strong对应原来的retain与copy,weak对应原来的assign。

EX:举例使用autorelease:

NSArray *testArray = PX_AUTORELEASE([[NSArray alloc] init]);

//如果支持arc,testArray就只是alloc init,release的事情由系统来做。

//如果不支持arc,那这条语句相当于:

NSArray *testArray = [[[NSArray alloc] init] autorelease];

这样不管以后改不改arc,都不会内存泄漏了 .

所以,arc的使用有两点:

A:在build phases中修改compiler Flags值。

B:在代码中判断是否支持arc,包括对属性(property)、释放(release)的判断。

3,在dealloc中需要这样做:

类如果注册了通知(观察者模式),需要remove掉。这个不管是否支持arc,都必须要做的。

- (void)dealloc {

[[NSNotificationCenterdefaultCenter] removeObserver:self];//如果注册了通知的话。

[self removeObserver:self forKeyPath:keyPath];//如果注册了kvo的话。

#if !__has_feature(objc_arc)  //在这里也需要判断是否支持arc,支持的话就执行旧工程中该release的语句.

[array release]; //array代表alloc但没有autorelease的变量

[super dealloc];

#endif

}

4,另外加点block的判断,这个是在4.0以后有的,当然也可以不进行判断,因为现在大多数都4.0以后了。

#if NS_BLOCKS_AVAILABLE

#endif

总结:

1,arc的设置是在build phases中修改compiler Flags的值。

2,如果使用了arc,在你的代码中不可以使用retain, release, autorelease,如果使用的话会报错。

3,如果使用了arc,在@property声明中,用strong和weak代替相应的retain, copy,和assign。

4,如果使用了arc,NSAutoReleasePool也不能使用,测试发现,用@autoreleasepool 代替,不会编译报错。

总之,一切你之前“背过”的那几条内存管理规则,你都不用去管了。而且,个人感觉,用arc代码清晰很多,而且效率也提高了些。

iOS里面如何同时使用开启ARC的库 和 没有开启 ARC的库,ARC 与非 ARC同时存在的问题的更多相关文章

  1. __block在ARC和非ARC下有什么不同

    一般在block中修改变量都需要事先加block进行修饰.在非arc中,block修饰的变量的引用计算是不变的.在arc中,会引用到,并且计算+1:非arc下可使用(arc直接使用__weak即可) ...

  2. ios工程中ARC与非ARC的混合

    ARC与非ARC在一个项目中同时使用, 1,选择项目中的Targets,选中你所要操作的Target,2,选Build Phases,在其中Complie Sources中选择需要ARC的文件双击,并 ...

  3. iOS 非ARC基本内存管理系列 -手把手教你ARC——iOS/Mac开发ARC入门和使用(转)

    手把手教你ARC——iOS/Mac开发ARC入门和使用 Revolution of Objective-c 本文部分实例取自iOS 5 Toturail一书中关于ARC的教程和公开内容,仅用于技术交流 ...

  4. IOS ARC与非ARC混合编译

    要开启ARC的:-fobjc-arc不开启ARC的:-fno-objc-arc 是否使用arc: 在build setting里找automatic reference counting,YES/NO

  5. iOS: ARC和非ARC下使用Block属性的问题

    1. Block的声明和线程安全 Block属性的声明,首先需要用copy修饰符,因为只有copy后的Block才会在堆中,栈中的Block的生命周期是和栈绑定的,可以参考之前的文章(iOS: 非AR ...

  6. IOS学习:常用第三方库(GDataXMLNode:xml解析库)

    IOS学习:常用第三方库(GDataXMLNode:xml解析库) 解析 XML 通常有两种方式,DOM 和 SAX: DOM解析XML时,读入整个XML文档并构建一个驻留内存的树结构(节点树),通过 ...

  7. (转)iOS 开发,工程中混合使用 ARC 和非ARC

    [前提知识] ARC:Automatic Reference Counting,自动引用计数 在开发 iOS 3 以及之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手动 retain. ...

  8. IOS ARC和非ARC文件混用

    ARC在SDK4.0的时候增加的,因为要和曾经的项目融合,就会有arc和非arc文件的混合. 当然,也就这两种情况: 1.自己的旧项目没有使用ARC,可是引入的第三方库却是使用了ARC的. 2.自己的 ...

  9. iOS 开发,工程中混合使用 ARC 和非ARC(转)

    [前提知识] ARC:Automatic Reference Counting,自动引用计数 在开发 iOS 3 以及之前的版本的项目时我们要自己负责使用引用计数来管理内存,比如要手动 retain. ...

  10. [ios]如何在ARC代码中混编非ARC代码

    参考 :http://blog.sina.com.cn/s/blog_b595ce9e0101nvvn.html “ios中如果arc和非arc文件混编,可以在build parses中指定compi ...

随机推荐

  1. Linux iconv使用

    iconv [选项]文件 输入/输出格式规范:-f, --from-code=名称 原始文本编码-t, --to-code=名称 输出编码 信息:-l, --list 列举所有已知的字符集 输出控制: ...

  2. Volley框架支持HTTPS请求。

    第一次写帖子,嘿嘿. 最近了解到google2013IO大会出了个网络框架,正好项目也需要用到,就看了下. 最后发现接口都是HTTPS的,但是Volley默认是不支持HTTPS,网上找了好久,都没有对 ...

  3. 事务Isolation Level 例子详解

    举例分析: 我们有A表, 包含两条数据. Read uncommitted: 假设我们有两个事务 Trans1, Trans2. 它们的操作如下: Trans 1: 更新A1 -> A11, 然 ...

  4. 队爷的讲学计划 CH Round #59 - OrzCC杯NOIP模拟赛day1

    题目:http://ch.ezoj.tk/contest/CH%20Round%20%2359%20-%20OrzCC杯NOIP模拟赛day1/队爷的讲学计划 题解:刚开始理解题意理解了好半天,然后发 ...

  5. PHP按最大宽高等比例缩放图片类

    本来用phpthumb来缩略图片是十分方便的,但是最近在sae上写项目发现phpthumb在sae上保存文件时会出问题,想来实现一个简单的按最大宽高等比例缩放图片类也并不困难,于是便自己写了一个方便修 ...

  6. 裸机编程与OS环境编程的有关思考

    这里的所谓的裸机编程指的是为“无OS支持的硬件系统编程”,而实际的编程工作肯定需要一个环境,通常这样的情况中,编程和编译的环境叫做“宿主机”,最终的程序在“目标机”上运行(交叉编译).而OS环境编程指 ...

  7. (转载)javascript客户端生成MD5值的函数代码

    (转载)http://www.jb51.net/article/26223.htm 用js实现的客户端即可实现md5值的代码,一般情况下都是后台语言才有的,客户端也有了,方便有需要的朋友了. 测试代码 ...

  8. 【转】VSync Count 垂直同步

    原文:http://blog.csdn.net/yesy10/article/details/7794556 Unity3D中新建一个场景空的时候,帧速率(FPS总是很低),大概在60~70之间.一直 ...

  9. Redis的安装(Centos)(转)

    1.1. 什么是redis Redis是用C语言开发的一个开源的高性能键值对(key-value)数据库.它通过提供多种键值数据类型来适应不同场景下的存储需求,目前为止Redis支持的键值数据类型如 ...

  10. 【设计模式 - 20】之状态模式(State)

    1      模式简介 状态模式的定义: 状态模式允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类.这个模式将状态封装成独立的类,并将动作委托到代表当前状态的类的对象. 状态模式的优点 ...