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

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. 通过分析WP的代码来学习PHP。1

    下载了WP的代码,并且应用到了网站上面,现在也在正常的运行中,地址是:www.freealgorithm.tk .具体的申请过程就不赘述了,学习WP的代码. 他的目录结构就不看了,可以下载同名文件我会 ...

  2. PAT-乙级-1027. 打印沙漏(20)

    1027. 打印沙漏(20) 时间限制 200 ms 内存限制 65536 kB 代码长度限制 8000 B 判题程序 Standard 作者 CHEN, Yue 本题要求你写个程序把给定的符号打印成 ...

  3. sql不重复的查找统计数据(经典)

    例表如下: 表名:MYTEST TID    COL1    COL2     COL3 1           1           A            A2           1     ...

  4. tornado做简单socket服务器(TCP)

    http://blog.csdn.net/chenggong2dm/article/details/9041181 服务器端代码如下: #! /usr/bin/env python #coding=u ...

  5. Python中pass语句的作用

    http://mianshi.fenzhi.com/post/1529.html pass语句什么也不做,一般作为占位符或者创建占位程序,pass语句不会执行任何操作,比如:while False:p ...

  6. struts2 标签的使用之一 s:if

    struts2 的web 项目中为了方便的编写jsp,标签是最好的选择 1:struts2 标签库的定义在**-core-版本号.jar META-INF 路径下找到struts-tags.tld文件 ...

  7. iOS开发笔记--宏定义的黑魔法 - 宏菜鸟起飞手册

    宏定义在C系开发中可以说占有举足轻重的作用.底层框架自不必说,为了编译优化和方便,以及跨平台能力,宏被大量使用,可以说底层开发离开define将寸步难行.而在更高层级进行开发时,我们会将更多的重心放在 ...

  8. POJ 1562 && ZOJ 1709 Oil Deposits(简单DFS)

    题目链接 题意 : 问一个m×n的矩形中,有多少个pocket,如果两块油田相连(上下左右或者对角连着也算),就算一个pocket . 思路 : 写好8个方向搜就可以了,每次找的时候可以先把那个点直接 ...

  9. tomcat context 配置 项目部署

    将tomcat/conf/server.xml文件打开, 在</Host>标签之前添加: <Context path = "" docBase = "F ...

  10. ANDROID_MARS学习笔记_S01_012_RatingBar

    1.xml <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns: ...