该文介绍的方法是,将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;
{
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了.
没有评论:
发表评论