是否可以在Build Phases的编译源中添加“fno-objc-arc”而不启用非弧文件?

时间:2013-06-12 22:34:14

标签: ios automatic-ref-counting

是否有可能以某种方式处理非弧文件而不在构建阶段向编译源添加fno-objc-arc?更具体地说,有没有办法在代码中的某处添加fno-objc-arc?原因是,我想开源我的库之一,它使用非弧文件,我不希望使用我的库的人手动添加fno-objc-arc。只需拖放......

1 个答案:

答案 0 :(得分:3)

没有。但是如果你看看一些库做了什么,他们会写有条件地调用MRC调用的宏,例如releaseautorelease等,这取决于用户是否正在使用ARC进行编译,例如使用__has_feature(objc_arc)测试。然后代码使用这些宏,而不是标准的releaseretainautorelease调用。仔细实施后,您就可以拥有一个支持ARC和MRC的代码库。

例如,查看FMDB库的FMDatabase.h。实际上,您可以使用这些宏替换您的MRC调用,并且它们只会被有条件地包含在内,具体取决于项目是否使用ARC。

#if ! __has_feature(objc_arc)
    #define FMDBAutorelease(__v) ([__v autorelease]);
    #define FMDBReturnAutoreleased FMDBAutorelease

    #define FMDBRetain(__v) ([__v retain]);
    #define FMDBReturnRetained FMDBRetain

    #define FMDBRelease(__v) ([__v release]);
#else
    // -fobjc-arc
    #define FMDBAutorelease(__v)
    #define FMDBReturnAutoreleased(__v) (__v)

    #define FMDBRetain(__v)
    #define FMDBReturnRetained(__v) (__v)

    #define FMDBRelease(__v)
#endif