今天在进行代码走查时,竟然发现了下面这段代码:

Bad Code

顿时感觉吐槽无力,虽然我反复强调内存管理问题,无非就是谁申请谁释放,利用强弱引用避免 retain-cycles,但是还是会有这样那样的问题,leaks 每次就是一片红。本来是计划等他们交易都开发完了,进行一次集体代码走查,好好给他们上一课,集中来解决内存问题。但是由于个人原因我 7 月份会离开项目组,恐怕没有时间来这么做了,所以最终还是决定将工程转成 ARC 模式。

该项目是某行手机银行客户端,iOS 开发这块除了我,其他的所有 7 个开发人员都是项目组临时招聘的,技术参差不齐,毕竟公司招聘标准就是:便宜 + 能干事。我的职责就是负责客户端架构,公共机制的设计与实现,公共组件的封装,开发过程中的解疑。其他开发人员每人负责一两个模块的交易开发,其实无非就剩下请求数据绘界面的事了。

其实项目开始时就打算尝试用 ARC 的,但是项目组内其他人员之前都没接触过 ARC,迫于项目进度压力也没有时间做培训,就使用大家比较熟悉的 MRR,还是太信任他们了。

Convertion Steps

1.将不要转成 ARC 的代码标注一下

如开源代码 AFNetworking(因为项目需要支持 4.3,所以用的 AFNetworking 是支持 4.3 的非 ARC 版本)、GDataXML、RegexKitLite、Reachability 等,其实这些也能转,但是感觉没有必要,将这些源文件在 Build Phases / Complie Sources 中标注为-fno-objc-arc,如果之前用到了使用 ARC 的代码,现在可以将-fobjc-arc标记去掉了。

setp1

2.工程检查

我选择使用 Xcode5.0_DP 版本来转,之前使用 Xcode4.6 在转换过程中电脑经常会假死,或者 Xcode4.6 直接崩溃,不知道什么原因。而 Xcode5.0 默认就是 ARC 模式,我想为了能让之前的程序都转换为 ARC,它的转换工具一定比之前强化了不少。

Xcode -> Edit -> Refactor -> Convert to Objective-C ARC…

选择要转换的 Target,工程 target,如果有单元测试也会出现单元测试的 target,点击“Check”。

3.解决 ARC 不允许的问题

setp3

转换工具会自动将代码里面的 retain、release、autorelease 等操作去掉,属性中的 retain、copy、assign 转为为对应的关键字(retain、copy -> strong, assign 会根据工程是否支持 5.0 一下版本转出 weak,或 unsafe_unretained)。

但是如果你在宏里面定义如:

#define MB_RELEASE_SAFELY(__POINTER) { [__POINTER release]; __POINTER = nil; }

转换工具是不会自动处理里面的 release 的,需要手动将[__POINTER release];去掉。(我工程里面 4201 个问题基本上都是因为这个导致的)

此外在 CF 对象与 NS 对象之间转换的需要加上关键字__bridge,这个也需要手动来来修改。

4.开始转换

setp4

解决完所有的冲突,再次选择“Convert to Objective-C ARC…”,你就能看到这个界面,点击“Next”后,再次经过漫长的等待, 工具会列出了将会为了转换的代码的对照列表。默认所有出现在列表里面的文件都是选中的,你可以选在不要转换的文件,去掉对勾。确认完后,点击“Save”就完成了整个工程的转换工作, Congratulations!

(我在完成后编译时,发现之前被我标为-fno-objc-arc的文件会有报错,原来在转换过程中工具将之前的标记都去掉了,无奈再次标记了一遍。)

5.其他处理

因为我们工程支持 4.3,所以 weak, __weak 关键字不能用, 可以通过宏定义将 5.0 以下时 weak 关键字定义为 unsafe_unretained:

#if (!__has_feature(objc_arc)) || \
(defined __IPHONE_OS_VERSION_MIN_REQUIRED && \
__IPHONE_OS_VERSION_MIN_REQUIRED < __IPHONE_5_0) || \
(defined __MAC_OS_X_VERSION_MIN_REQUIRED && \
__MAC_OS_X_VERSION_MIN_REQUIRED < __MAC_10_7)
#undef weak
#define weak unsafe_unretained
#undef __weak
#define __weak __unsafe_unretained
#endif

在 ARC 模式下,使用 performSelector 方法会有编译警告:PerformSelector may cause a leak because its selector is unknown,作为有洁癖的程序员是不能容许程序中有警告的:

#progma clang diagnostic push
#progma clang disgnostic ignored "-Warc-performSelecotr-leaks"
[self performSelector:@selector(mySelector:) withObject:object];
#progma clang disgnostic pop

Posted by XiaoYi_HD - 6月 19 2013
如需转载,请注明: 本文来自 Esoft Mobile

Convert to Objective-C ARC的更多相关文章

  1. Convert BSpline Curve to Arc Spline in OpenCASCADE

    Convert BSpline Curve to Arc Spline in OpenCASCADE eryar@163.com Abstract. The paper based on OpenCA ...

  2. Objective C ARC 使用及原理

    手把手教你ARC ,里面介绍了ARC的一些特性, 还有将非ARC工程转换成ARC工程的方法 ARC 苹果官方文档 下面用我自己的话介绍一下ARC,并将看文档过程中的疑问和答案写下来.下面有些是翻译,但 ...

  3. Objective之ARC

    http://blog.csdn.net/siemenliu/article/details/7891345

  4. 对Xcode菜单选项的详细探索(干货)

    本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xcode7,但是一般都只是用了一些基础的功能,说来也惭愧.在一次偶然的机遇突然发现了“显示调用层级”的选 ...

  5. 【转】对 Xcode 菜单选项的详细探索(干货)

    http://www.cocoachina.com/ios/20151204/14480.html 本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xco ...

  6. xcode的菜单栏功能解析

    [Xcode 7.2]Xcode菜单栏之你不知道的那点事 File: New : 可以新建tap,窗口,新文件,playground,workspace,target等等. Add Files to ...

  7. Automake

    Automake是用来根据Makefile.am生成Makefile.in的工具 标准Makefile目标 'make all' Build programs, libraries, document ...

  8. 对 Xcode 菜单选项的详细探索(转)

    转自 http://www.cnblogs.com/dsxniubility/p/4983614.html 本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到 ...

  9. Calcite分析 - RelTrait

    RelTrait 表示RelNode的物理属性 由RelTraitDef代表RelTrait的类型 /** * RelTrait represents the manifestation of a r ...

  10. 对Xcode菜单选项的详细探索(来自董铂然的微博http://www.cnblogs.com/dsxniubility/p/4983614.html)

    本文调研Xcode的版本是 7.1,基本是探索了菜单的每一个按钮.虽然从xcode4一直用到了xcode7,但是一般都只是用了一些基础的功能,说来也惭愧.在一次偶然的机遇突然发现了“显示调用层级”的选 ...

随机推荐

  1. BZOJ 3160 万径人踪灭 解题报告

    这个题感觉很神呀.将 FFT 和 Manacher 有机结合在了一起. 首先我们不管那个 “不能连续” 的条件,那么我们就可以求出有多少对字母关于某一条直线对称,然后记 $T_i$ 为关于直线 $i$ ...

  2. 20130729--Samba的学习

    (一).基本概念 samba是一个能让你的Unix计算机和其它MS Windows计算机相互共享资源的软件. samba提供有关资源共享的三个功能,包括:smbd,执行它可以使Unix能够共享资源给其 ...

  3. POJ 1269 Intersecting Lines(几何)

    题目链接 题意 : 给你两条线段的起点和终点,一共四个点,让你求交点坐标,如果这四个点是共线的,输出“LINE”,如果是平行的就输出“NONE”. 思路 : 照着ZN留下的模板果然好用,直接套上模板了 ...

  4. BZOJ 2806 cheat

    首先这个题目显然是要二分转换成判断可行性的 之后我们考虑DP 设f(i)表示 1->i 熟悉的子串的长度的最大值 那么对于i这个点,要么不在熟悉的子串中,要么在熟悉的子串中 所以得到 f(i)= ...

  5. IOS - IOS之同步请求、异步请求、GET请求、POST请求

    1.同步请求可以从因特网请求数据,一旦发送同步请求,程序将停止用户交互,直至服务器返回数据完成,才可以进行下一步操作, 2.异步请求不会阻塞主线程,而会建立一个新的线程来操作,用户发出异步请求后,依然 ...

  6. 网上图书商城项目学习笔记-035工具类之JdbcUtils及TxQueryRunner及C3P0配置

    事务就是保证多个操作在同一个connection,TxQueryRunner通过JdbcUtils获取连接,而JdbcUtils通过ThreadLocal<Connection>确保了不同 ...

  7. 基于web的项目管理软件Redmine

    Redmine是用Ruby开发的基于web的项目管理软件,是用ROR框架开发的一套跨平台项目管理系统,据说是源于Basecamp的ror版而来, 支持多种数据库,有不少自己独特的功能,例如提供wiki ...

  8. 【原创】通俗易懂的讲解KMP算法(字符串匹配算法)及代码实现

    一.本文简介 本文的目的是简单明了的讲解KMP算法的思想及实现过程. 网上的文章的确有些杂乱,有的过浅,有的太深,希望本文对初学者是非常友好的. 其实KMP算法有一些改良版,这些是在理解KMP核心思想 ...

  9. window下gvim中文界面改变成英文界面

    中文环境下设置GVIM的界面.菜单.提示为英文语言 修改你的_vimrc,通常为类似C:\Program Files\Vim 加入以下语句至末尾 " set the menu & t ...

  10. 关于TableView中出现deallocated问题

    Message sent to deallocated instance 关于的ios 开发中 deallocated问题,相信大家遇到了不少了: 关于怎么查找解决这个问题,特别是当问题在tableV ...