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

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. Xcode 合并分支报错

    原理和操作步骤见如下转载的两篇文章, 我所使用的 svn 客户端软件是 Mac 下面的 Versions.app v1.06 这个版本包含一个多人开发的bug bug 的解决方案见我之前转载的两篇文章 ...

  2. iOS本地动态验证码生成-b

    用于ios本地动态生成验证码,效果如下: demo.gif 导入CoreGraphics.framework用于绘制图形 封装UIView,便捷使用,代码如下: AuthcodeView.h #imp ...

  3. Android Studio 单刷《第一行代码》系列 05 —— Fragment 基础

    前情提要(Previously) 本系列将使用 Android Studio 将<第一行代码>(书中讲解案例使用Eclipse)刷一遍,旨在为想入坑 Android 开发,并选择 Andr ...

  4. spring的三种注解管理器

    1.依赖注入的注解解析器 在配置文件中; * xsd xmlns:context="http://www.springframework.org/schema/context" h ...

  5. java 凯撒大帝密码

    古罗马皇帝凯撒在打仗时曾经使用过以下方法加密军事情报:

  6. js中批量处理样式——cssText的使用

    http://www.cnblogs.com/snandy/archive/2011/03/12/1980444.html

  7. firefly的环境搭建(2013年9月25日最新,win下最详图文)

    源地址:http://www.9miao.com/question-15-53785.html 一.安装PythonFirefly是采用Python编写的高性能.分布式游戏服务器框架,所以使用Fire ...

  8. SetTimer在无窗口和有窗口线程的使用 . .

    今天犯了一个粗心的错误,在无窗口线程中,SetTimer中设置计时器ID,而WM_TIMER消息响应函数中得到的计时器ID却不是之前设置的计时器ID. 对应计时器ID的输出的是一个随机数字. 原来在m ...

  9. java 用JNA方法调用C++动态链接库

    JNA(Java Native Access)框架是一个开源的Java框架,是SUN公司主导开发的,建立在经典的JNI的基础之上的一个框架.非常强大.易用,功能上类似与.NET的P/Invoke.你只 ...

  10. POJ3026——Borg Maze(BFS+最小生成树)

    Borg Maze DescriptionThe Borg is an immensely powerful race of enhanced humanoids from the delta qua ...