如何在cocos2d项目中enable ARC

基本思想就是不支持ARC的代码用和支持ARC的分开,通过xcode中设置编译选项,让支持和不支持ARC的代码共存. 

cocos2d是ios app开发中最主流的2d游戏引擎,但是cocos2d开发的时候,苹果还没有推出 ARC(automatic reference counting,一种辅助内存管理的机制,编译器自动在代码中加入内存管理的语句,防止因开发者的疏忽造成的内存泄露和崩溃问题).所以如果你用cocos2d模版生成的工程,ARC是关闭的.如果直接enable ARC, 就会出现很多编译错误.

要想享用ARC的好处,就要自己想办法了.

基本思路就是,将cocos2d的文件不使用ARC.在xcode中是可指定部分源文件用arc.

方法来自于这个帖子 http://www.tinytimgames.com/2011/07/22/cocos2d-and-arc/

该文介绍的方法是,将cocos2d作为单独的工程编译(无arc),将库文件引用到enable ARC的工程中,稍加修改即可.

但是回复中有更简单的方法(这个回复的人也真够不客气的,有兴趣去看一下horseshoe7的回复).个人实操步骤如下:

注意:

  - 如果你用cocos2d v2.0以后的版本,那么你有福了,4,5,6,7都不会出错,可跳过

  - 如果你用cocos2d v1.1,那么你只会碰到4的问题,5,6,7可以跳过.

  - 如果你和我一样用了1.0.1,那么就必须修改下述所有地方. 

1. 使用LLVM: 在build setting中设置默认编译器,搜"LLVM", 选Apple LLVM compiler 3.1

2. enable ARC: 上述界面,搜auto, 将Object C Automatic Reference Counting设为Yes.

3. complie source build phase中有列出所有的.m文件,复选中cocos2d的那些文件,回车,输入"-fno-objc-arc",回车. 这样,这些文件就不会被ARC检查. 建议将cocos2d自己生成的AppDelegate.m和RootViewController.m都关ARC.只在自己的代码中使用ARC.

4. 然后编译一把,会发出现很多 CCArray相关的error了, 这些来自于CCArray这个结构体的头文件里,它用到了好多inline的函数,LLVM编译器不认.所以要把这些文艺函数都改为普通函数,而且不能放在头文件里,要放在m文件里,这样就要自己加个ccCArray.m文件.代码都在ccCArray.h里,自己挪代码?多麻烦.其实不用自己改.答案就在cocos2d v2.0里,因为v2全面支持ARC了,所以cocos2d都帮你改好了.去下载一套v2的代码,把ccCarray.h和.m这两个文件copy过来,覆盖.h文件,将.m文件添加到你的工程里,再编译.warning消失了,但是出来几个link error.不要紧,是因为cocos2d v2改了两个函数名字.到CCArray.m中,找到 insertionSort 和 mergesortL,在前面加上个cc_,编译吧,CCArray的就编过了.

5.ccMacro.h 把v1.1里ARC Macros那三个宏定义merge过来.ccCArry.m里有用到.

6. 在CCDirectorIOS.h中,将CCDirectorFast函数的里的NSAutoreleasePool那一句去掉.在对应的CCDirectorIOS.m文件中加入如下一句

static NSAutoreleasePool *autoreleasePool = nil;
其实就是把变量改为静态的.

7.  CCActionManager.h里的结构体tHashElement会报错.替换成

typedef struct _hashElement
{
struct ccArray *actions;
__unsafe_unretained id target;
NSUInteger actionIndex;
__unsafe_unretained CCAction *currentAction;
BOOL currentActionSalvaged;
BOOL paused;
UT_hash_handle hh;
} tHashElement;

8. 至此,就只剩下把自己的代码中的错误了: xcode有工具可以转,菜单选Edit/Refactor/Convert to Object C ARC, 选中要转换文件,转之.xcode会让你看一眼那些地方删掉了,自己看一下,基本上就是去掉了dealloc,retain,release这些东西.因为ARC会自动为你生成.好了,这样以后再编译,就没有error了.

个人原创,转载请注明出处. 

posted on 2012-08-27 11:45  dqshll  阅读(1275)  评论(0编辑  收藏  举报

导航