zoukankan      html  css  js  c++  java
  • 如何在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了.

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

  • 相关阅读:
    占卜DIY
    飞行员兄弟
    给树染色
    国王游戏
    雷达设备
    畜栏预定
    防晒
    去雨系列论文笔记
    First day
    如何用fprintf写十六进制 并控制格式
  • 原文地址:https://www.cnblogs.com/dqshll/p/2658303.html
Copyright © 2011-2022 走看看